home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / node2src.zip / CNFG-SUB.BAS < prev    next >
BASIC Source File  |  1990-02-14  |  100KB  |  2,256 lines

  1. ' $linesize:132
  2. ' $title: 'CNFG-SUB.BAS CPC17-3, Copyright 1987-89 by D. Thomas Mack'
  3. '  Copyright 1987,1988 and 1989 by D. Thomas Mack, all rights reserved.
  4. '  Name ...............: CNFG-SUB.BAS
  5. '  Written by .........: D. Thomas Mack
  6. '  First Released .....: May 28, 1989
  7. '  Subsequent Releases.: 
  8. '  Copyright ..........: 1987-89
  9. '  Purpose.............: The Remote Bulletin Board System for the IBM PC,
  10. '                        RBBS-PC, configuration program -- CONFIG.BAS
  11. '                        utilizes a lot of menus and string space.
  12. '                        These are incorporated within CNFG-SUB.BAS as a
  13. '                        seperately callable subroutines in order to free
  14. '                        up as much code as possible within the 64K code
  15. '                        segment used by CONFIG.BAS.
  16. '  Parameters..........: Most parameters are passed via a COMMON statement.
  17. '
  18. ' Subroutine  Line      Function of Subroutine
  19. '    Name    Number
  20. ' ALLCAPS    61212+     Captialize a string
  21. ' ANSIDECODE 62040+     Convert ANSI strings into english text expressions
  22. ' ANYINTEGER 61450      Prompt for any integer
  23. ' ANYNUMBER  61400      Prompt for any number
  24. ' ASKRO      61100      Ask a question on a specific row
  25. ' ASKUPOS    61300      Ask for identifying field in USERS record
  26. ' BRKFNAME   61830      Break file name in drive/path, prefix, extension
  27. ' CHKFMSDIR  61700      Check FMS directory for valid structure
  28. ' CHKPERSDIR 61755      Check Personal directory format
  29. ' CNFGINIT   60385      Initialize CONFIG's constants
  30. ' COLORCODE  62040+     Convert response into ANSI-meaningful strings
  31. ' DISPLAY    12190      Display the CONFIG menu pages
  32. ' FINDFILE   61600      Determine whether a file exists
  33. ' FINDLAST   61850      Find last occurence of a character in a string
  34. ' GETANSI    62000      Prompt for ANSI colors to be used
  35. ' GETASCII   61810      Get any character by character or ascii value
  36. ' GETCOLOR   61950      Process request for setting color
  37. ' GETINIT    61110      Get answers that are integers
  38. ' GETNUMYN   61150      Get TRUE/FALSE answer to a YES/NO question
  39. ' GETYESNO   61200      Ask a question with a "yes" or "no" response
  40. ' HANDERR    61775+     Handle error checking for FMS directories
  41. ' MMINTEGER  61500      Prompt for integer with min and a max
  42. ' NETTYPE    60382      Prompt for supported network types
  43. ' REMOVE     61800      Remove characters from a string
  44. ' SECURE     61860      Allow commands and their security level to be changed
  45. ' TRIMTRAIL  61840      Remove trailing characters from a string
  46. '
  47. '  $INCLUDE: 'CNFG-VAR.BAS'
  48. '
  49. '  $SUBTITLE: 'DISPLAY - subroutine to display CONFIG's menus'
  50. '  $PAGE
  51. '
  52. '  SUBROUTINE NAME    --  DISPLAY
  53. '
  54. '  INPUT PARAMETERS   --  PARAMETER        DESCRIPTION
  55. '                         IX = 0           DISPLAY THE CHOICE OF MENUS
  56. '                         IX = -1          RE-READ THE INPUT (INVALID REQUEST)
  57. '                         IX > 0           DISPLAY THE APPROPRIATE PAGE
  58. '
  59. '  OUTPUT PARAMETERS  --  HJ$              OPTION SELECTED
  60. '                         IPAGE            MENU PAGE CONTAINING OPTION
  61. '                         ILOOKUP          INDEX (1 TO 20) OF OPTION SELECTED
  62. '
  63. '  SUBROUTINE PURPOSE --  TO DISPLAY CONFIG'S MENUS AND REQUEST OPTION
  64. '
  65.       SUB DISPLAY STATIC
  66. '
  67. ' *  DISPLAY CONFIG'S MAIN FUNCTION KEY MENU
  68. '
  69.       IF IX > 0 THEN _
  70.          GOTO 12320
  71.       IF IX = -1 THEN _
  72.          GOTO 12590
  73. 12190 COLOR FG,BG,BORDER
  74.       CLS
  75.       DISPLAYED.PAGE.NUMBER = 0
  76.       I! = FRE(C$)
  77.       COLOR 0,7,0
  78.       LOCATE 4,10
  79.       PRINT "MAPLE RBBS-PC "+ CONFIG.VERSION$ + " CONFIGURATION PROGRAM "
  80.       COLOR FG,BG,BORDER
  81.       LOCATE 1,1,0
  82.       PRINT "Copyright (c) 1983-1990 Tom Mack"
  83.       LOCATE 2,1,0
  84.       PRINT "39 Cranbury Dr, Trumbull, CT. 06611";
  85.       IF CONFERENCE.MODE THEN _
  86.          GOSUB 24970
  87.       LOCATE  5,1
  88.       PRINT "   F1            Global RBBS-PC Parameters (part 1)
  89.       PRINT "   F2            Global RBBS-PC Parameters (part 2)
  90.       PRINT "   F3            Global RBBS-PC Parameters (part 3)
  91.       PRINT "   F4            RBBS-PC System Files (part 1)
  92.       PRINT "   F5            RBBS-PC System Files (part 2)
  93.       PRINT "   F6            Parameters for RBBS-PC's 'Doors'
  94.       PRINT "   F7            Parameters for RBBS-PC's Security (part 1)
  95.       PRINT "   F8            Parameters for RBBS-PC's Security (part 2)
  96.       PRINT "   F9            Parameters for multiple RBBS-PC's
  97.       PRINT "  F10            RBBS-PC utilities
  98.       PRINT "  Shift-F1       RBBS-PC File Management Faciliites"
  99.       PRINT "  Shift-F2       RBBS-PC Communications Parameters (part 1)
  100.       PRINT "  Shift-F3       RBBS-PC Communications Parameters (part 2)
  101.       PRINT "  Shift-F4       Parameters for RBBS-PC NET-MAIL
  102.       PRINT "  Shift-F5       New users parameters"
  103.       PRINT "  Shift-F6       Library Sub-System"
  104.       PRINT "  Shift-F7       RBBS-PC Color parameters"
  105.       PRINT "  Shift-F8       Reserved for future use"
  106.       XX$ = "Press END to terminate or Function Key to select page for parameters shown "
  107.       GOSUB 50345
  108.       LOCATE ,,1
  109. 12310 GOSUB 22160
  110. 12320 IF IX THEN _            'IX    Key    Where to branch to
  111.          ON IX GOTO 12360, _  ' 1       F1 - Global Parameters (Part 1)
  112.                     12370, _  ' 2       F2 - Global Parameters (Part 2)
  113.                     12380, _  ' 3       F3 - Global Parameters (Part 3)
  114.                     12390, _  ' 4       F4 - RBBS-PC System Files (Part 1)
  115.                     12400, _  ' 5       F5 - RBBS-PC System Files (Part 2)
  116.                     12410, _  ' 6       F6 - RBBS-PC "doors"
  117.                     12420, _  ' 7       F7 - RBBS-PC security parms. (Part 1)
  118.                     12466, _  ' 8       F8 - RBBS-PC security parms. (Part 2)
  119.                     12470, _  ' 9       F9 - Multiple RBBS-PC parameters
  120.                     12480, _  '10      F10 - RBBS-PC's utilities
  121.                     12490, _  '11 Shift-F1 - RBBS-PC File Manager
  122.                     12500, _  '12 Shift-F2 - RBBS-PC comm. parameters (Part 1)
  123.                     12505, _  '13 Shift-F3 - RBBS-PC comm. parameters (Part 2)
  124.                     12510, _  '14 Shift-F4 - RBBS-PC Net Mail
  125.                     12520, _  '15 Shift-F5 - New user parameters
  126.                     12530, _  '16 Shift-F6 - Library parameters
  127.                     12540, _  '17 Shift-F7 - RBBS-PC Color parameters
  128.                     12310, _  '18 Shift-F8 - Reserved for future use
  129.                     12340, _  '19     PgUp - Go to previous page
  130.                     12330, _  '20     PgDn - Go to next page
  131.                     12630, _  '21      End - Terminate CONFIG
  132.                     12350     '22    Enter - Re-display current page
  133.       GOTO 12310
  134. '
  135. ' *  COMMON ROUTINE TO HANDLE UNDEFINED OPTIONS
  136. '
  137. 12325 IX = IPAGE
  138.       GOTO 12320
  139. '
  140. ' *  COMMON ROUTINE TO HANDLE PAGE UP OF DISPLAYS
  141. '
  142. 12330 IF (DISPLAYED.PAGE.NUMBER + 1 ) > 17 THEN _
  143.          GOTO 12190
  144.       IX = DISPLAYED.PAGE.NUMBER + 1
  145.       GOTO 12320
  146. '
  147. ' *  COMMON ROUTINE TO HANDLE PAGE DOWN OF DISPLAYS
  148. '
  149. 12340 IF (DISPLAYED.PAGE.NUMBER - 1) < 1 THEN _
  150.          GOTO 12190
  151.       IX = DISPLAYED.PAGE.NUMBER - 1
  152.       GOTO 12320
  153. '
  154. ' *  RETURN TO PRIMARY MENU SELECTION DISPLAY
  155. '
  156. 12350 GOSUB 60380
  157.       GOTO 12310
  158. '
  159. ' *  COMMON CONFIGURATION PROGRAM MENU AND PAGE DISPLAY
  160. '
  161. 12360 DISPLAYED.PAGE.NUMBER = 1
  162.       GOSUB 24800
  163.       LOCATE  3,1
  164.       PRINT " 1. SYSOP's Public First Name -------------------- " + SYSOP.FIRST.NAME$
  165.       PRINT " 2. SYSOP's Public Last Name --------------------- " + SYSOP.LAST.NAME$
  166.       PRINT " 3. SYSOP's default expert mode at signon -------- " + EXPERT.USER$
  167.       PRINT " 4. SYSOP's office hours -------------------------"STR$(START.OFFICE.HOURS);" to"STR$(END.OFFICE.HOURS)
  168.       PRINT " 5. Page SYSOP using printer's bell -------------- " + M11$
  169.       PRINT " 6. Go off-line whenever a DISK FULL occurs ------ " ; FNYESNO$(DISKFULL.GO.OFFLINE)
  170.       PRINT " 7. Prompt bell default is ----------------------- " + PROMPT.BELL$
  171.       PRINT " 8. Maximum time per session (in minutes) --------"STR$(MINUTES.PER.SESSION!)
  172.       PRINT " 9. Maximum minutes per day ----------------------";STR$(MAX.PER.DAY)
  173.       PRINT "10. Factor to extend session time for uploads ----" + STR$(UPLOAD.TIME.FACTOR!)
  174.       PRINT "11. # Months of inactivity before user deleted ---"STR$(ACT.MNTHS.B4.DELETING)
  175.       PRINT "12. Name of RBBS-PC shown initially is ----------- " + RBBS.NAME$
  176.       PRINT "13. Foreground color (for color monitors) is -----"STR$(FG)
  177.       PRINT "14. Background color (for color monitors) is -----"STR$(BG)
  178.       PRINT "15. The border color (for color monitors) is -----"STR$(BORDER)
  179.       PRINT "16. Your CONFIG.SYS contains 'DEVICE=ANSI.SYS'---- " + FNYESNO$(DOSANSI)
  180.       IF SMART.TEXT THEN _
  181.          SMART.TEXT$ = STR$(SMART.TEXT) _
  182.       ELSE SMART.TEXT$ = "<none>"
  183.       PRINT "17. Control character for SMART TEXT -------------" + SMART.TEXT$
  184.       PRINT "18. File with automatic operator page parameters - " ; AUTOPAGE.DEF$
  185.       X = INSTR("ANS",LOGON.MAIL.LEVEL$)
  186.       IF X < 1 THEN _
  187.          X = 1
  188.       X$ = MID$("OLD & NEWNEW ONLY NONE",9*X-8,9)
  189.       IF X$ = "NONE" THEN _
  190.          X$ = NONE.PICKED$                                          ' KG010803
  191.       PRINT "19. Personal mail notification level at logon is - " + X$
  192.       GOTO 12580
  193. 12370 DISPLAYED.PAGE.NUMBER = 2
  194.       GOSUB 24800
  195.       LOCATE  3,1
  196.       PRINT "21. Remind users of messages that they left ------ " + FNYESNO$(MESSAGE.REMINDER)
  197.       PRINT "22. Remind users of # uploads and downloads? ----- " + FNYESNO$(REMIND.FILE.TRANSFERS)
  198.       PRINT "23. Remind users of their terminal profile? ------ " + FNYESNO$(REMIND.PROFILE)
  199.       PRINT "24. Enable download of new files at logon -------- " + FNYESNO$(NEW.FILES.CHECK)
  200.       PRINT "25. Default user page length is ------------------" + STR$(PAGE.LENGTH)
  201.       PRINT "26. Maximum number of lines allowed per message --" + STR$(MAX.MESSAGE.LINES)
  202.       PRINT "27. Is system 'welcome' interruptable? ----------- " + FNYESNO$(WELCOME.INTERRUPTABLE)
  203.       PRINT "28. Are system bulletins to be 'optional'? ------- " + FNYESNO$(BULLETINS.OPTIONAL)
  204.       PRINT "29. Type of PC RBBS-PC will be running on? ------- " + COMPUTER.TYPE$
  205.       PRINT "30. Symbols to use for SYSOP commands ------------ " + SYSOP.COMMANDS$
  206.       PRINT "31. Symbols to use for MAIN menu commands -------- " + MAIN.COMMANDS$
  207.       PRINT "32. Symbols to use for FILE menu commands -------- " + FILE.COMMANDS$
  208.       PRINT "33. Symbols to use for UTILITIES menu commands --- " + UTIL.COMMANDS$
  209.       PRINT "34. Symbols to use for global commands ----------- " + GLOBAL.COMMANDS$
  210.       PRINT "35. Show section in command prompt --------------- " + FNYESNO$(SHOW.SECTION)
  211.       PRINT "36. Show commands in command prompt -------------- " + FNYESNO$(COMMANDS.IN.PROMPT)
  212.       PRINT "37. Restrict valid commands to current section --- " + FNYESNO$(RESTRICT.VALID.CMDS)
  213.       PRINT "38. Use machine language routines for speed ------ " + FNYESNO$(TURBO.RBBS)
  214.       PRINT "39. Use BASIC PRINT for screen writes ------------ " + FNYESNO$(USE.BASIC.WRITES)
  215.       PRINT "40. # of lines for extended file descriptions ----" + STR$(MAX.EXTENDED.LINES)
  216.       GOTO 12580
  217. 12380 DISPLAYED.PAGE.NUMBER = 3
  218.       GOSUB 24800
  219.       LOCATE  3,1
  220.       PRINT "41. Field used to identify users ----------------- " + HASH.ID$
  221.       PRINT "42. Field used to distinguish users with same ID-- " + INDIV.ID$
  222.       PRINT "43. Start position identifying personal downloads-"  + STR$(PERSONAL.BEGIN)
  223.       PRINT "44. Field length to identify personal downloads --"  + STR$(PERSONAL.LEN)
  224.       PRINT "45. Prompt for first part of personal identifier - " + FIRST.NAME.PROMPT$
  225.       PRINT "46. Prompt for last part of personal identifier -- " + LAST.NAME.PROMPT$
  226.       PRINT "47. Enforce upload/download ratios --------------- " + FNYESNO$(ENFORCE.UPLOAD.DOWNLOAD.RATIOS)
  227.       PRINT "48. RESTRICT users by SUBSCRIPTION date ---------- " + FNYESNO$(RESTRICT.BY.DATE)
  228.       PRINT "49. Security level when SUBSCRIPTION expires -----"  + STR$(EXPIRED.SECURITY)
  229.       PRINT "50. Days before expiration to warn callers -------"  + STR$(DAYS.TO.WARN)
  230.       PRINT "51. Default # days in SUBSCRIPTION PERIOD --------"  + STR$(DAYS.IN.SUBSCRIPTION.PERIOD)
  231.       PRINT "52. Turn printer off after each recycle ---------- " + FNYESNO$(TURN.PRINTER.OFF)
  232.       PRINT "53. Play musical themes for RBBS-PC functions----- " + FNYESNO$(MUSIC)
  233.       PRINT "54. BUFFER SIZE used when displaying text files --" + STR$(BUFFER.SIZE)
  234.       PRINT "55. Stack space to be made available -------------" + STR$(SIZE.OF.STACK)
  235.       PRINT "56. File shown users when SYSOP wants system next  " + NOT.YET.IN$ ' F7.MESSAGE$
  236.       PRINT "57. Ask users their (What is your ...) ----------- " + USER.LOCATION$
  237.       PRINT "58. Show ALL DIRECTORIES in order in dir of dir -- " + FNYESNO$(USE.DIR.ORDER)
  238.       PRINT "59. BUFFER SIZE for writes on internal protocols -" + STR$(WRITE.BUF.DEF)
  239.       PRINT "60. Voice Synthesizer support -------------------- " + VOICE.TYPE$
  240.       GOTO 12580
  241. 12390 DISPLAYED.PAGE.NUMBER = 4
  242.       GOSUB 24800
  243.       IF INSTR(DRIVE.FOR.BULLETINS$,":") < 1 THEN _
  244.          DRIVE.FOR.BULLETINS$ = DRIVE.FOR.BULLETINS$ + ":"
  245.       LOCATE  3,1
  246.       PRINT "61. Drive and file describing 'bulletins' is ----- " + DRIVE.FOR.BULLETINS$ + BULLETIN.MENU$
  247.       PRINT "62. Number of active 'bulletins' -----------------" + STR$(ACTIVE.BULLETINS)
  248.       PRINT "63. Prefix used to name bulletin files is -------- " + BULLETIN.PREFIX$
  249.       PRINT "64. Drive and path (optional) for 'help' files --- " + HELP.PATH$
  250.       PRINT "65. Prefix used to name three major 'help' files - " + HELP.FILE.PREFIX$
  251.       PRINT "66. Extension for help files of individual cmds -- " + HELP.EXTENSION$
  252.       PRINT "67. HELP file when callers CATEGORIZE uploads ---- " + UPCAT.HELP$
  253.       PRINT "68. Name of 'newuser' file shown to new users ---- " + NEWUSER.FILE$
  254.       PRINT "69. Name of 'welcome' file shown at logon -------- " + WELCOME.FILE$
  255.       PRINT "70. The SYSOP's command menu is named ------------ " + MENU$(1)
  256.       PRINT "71. The MAIN system menu is named ---------------- " + MENU$(2)
  257.       PRINT "72. The file subsystem menu is named ------------- " + MENU$(3)
  258.       PRINT "73. The utilities subsystem menu is named -------- " + MENU$(4)
  259.       PRINT "74. Menu that lists available conferences is ----- " + CONFERENCE.MENU$
  260.       PRINT "75. Menu that lists questionnaires available is -- " + ANS.MENU$
  261.       PRINT "76. Drive/path for optional questionnaires ------- " + QUES.PATH$
  262.       PRINT "77. File with main SYSOP-supplied user interface - " + MAIN.PUI$
  263.       PRINT "78. Allow menus to pause in the middle ----------- " + FNYESNO$(MENUS.CAN.PAUSE)
  264.       PRINT "79. Drive/path where macro files are stored ------ " + MACRO.DRVPATH$
  265.       IF MACRO.EXTENSION$ = "" THEN _                                ' KG060701
  266.          X$ = NONE.PICKED$ _                                         ' KG060701
  267.       ELSE X$ = MACRO.EXTENSION$                                     ' KG060701
  268.       PRINT "80. Extension of macro files --------------------- " ; X$ ' KG060701
  269.       GOTO 12580
  270. 12400 DISPLAYED.PAGE.NUMBER = 5
  271.       GOSUB 24800
  272.       LOCATE  3,1
  273.       PRINT " 81. File containing invalid user names ----------- " + TRASHCAN.FILE$
  274.       PRINT " 82. Name questionnaire required of ALL callers --- " + REQUIRED.QUESTIONNAIRE$
  275.       PRINT " 83. Name of 'pre-log' file ----------------------- " + PRELOG$
  276.       PRINT " 84. Name of questionnaire required of new users -- " + NEW.USER.QUESTIONNAIRE$
  277.       PRINT " 85. Name of 'epi-log' questionnaire -------------- " + EPILOG$
  278.       PRINT " 86. System file containing messages is named ----- " + MAIN.MESSAGE.FILE$
  279.       PRINT " 87. System file for recording users is named ----- " + MAIN.USER.FILE$
  280.       PRINT " 88. System file for comments to SYSOP is named --- " + COMMENTS.FILE$
  281.       PRINT " 89. Record comments as private messages ---------- " ; FNYESNO$(COMMENTS.AS.MESSAGES)
  282.       PRINT " 90. System file for 'callers' is named ----------- " + CALLERS.FILE$
  283.       PRINT " 91. Extended logging to 'callers' file ----------- " ; FNYESNO$(EXTENDED.LOGGING)
  284.       PRINT " 92. Wrap-around the 'callers' file --------------- " + NOT.YET.IN$ ' WRAP.CALLERS.FILE$
  285.       PRINT " 93. File controlling scan for mail waiting ------- " + CONFMAIL.LIST$
  286.       PRINT " 94. Max # of work variables in ques/macros -------"  ; STR$(MAX.WORK.VAR)
  287.       GOTO 12580
  288. 12410 DISPLAYED.PAGE.NUMBER = 6
  289.       GOSUB 24800
  290.       LOCATE  3,1
  291.       PRINT "101. Is the 'door' subystem available? ------------ " ; FNYESNO$(DOORS.AVAILABLE)
  292.       PRINT "102. The 'door' subsystem menu is named ----------- " + MENU$(5)
  293.       PRINT "103. File built dynamically to open a 'door' ------ " + RCTTY.BAT$
  294.       PRINT "104. When a 'door' closes, re-invoke RBBS-PC via -- " + RBBS.BAT$
  295.       PRINT "105. Drive/path to look for COMMAND.COM on -------- " + DISK.FOR.DOS$
  296.       PRINT "106. Use the Dos 'CTTY' command to redirect I/O --- " ; FNYESNO$(REDIRECT.IO.METHOD)
  297.       PRINT "107. Door Program to check users at logon --------- " ; REGISTRATION.PROGRAM$
  298.       PRINT "108. Logon door required of new users & security <="  ; STR$(MAX.REG.SEC)
  299.       PRINT "109. Name of control file for doors --------------- " ; DOORS.DEF$
  300.       GOTO 12580
  301. 12420 DISPLAYED.PAGE.NUMBER = 7
  302.       GOSUB 24800
  303.       LOCATE  3,1
  304.       PRINT "121. Pseudonym to sign on remotely as the SYSOP ---- " + MN1$+ " " +MN2$
  305.       PRINT "122. ESC key logs SYSOP on locally without password- " + FNYESNO$(ESCAPE.INSECURE)
  306.       PRINT "123. Minimum security level to log on RBBS-PC ------" + STR$(MINIMUM.LOGON.SECURITY)
  307.       PRINT "124. Default security level for new callers --------" + STR$(DEFAULT.SECURITY.LEVEL)
  308.       PRINT "125. Security level for SYSOP ----------------------" + STR$(SYSOP.SECURITY.LEVEL)
  309.       PRINT "126. Minimum security level to see SYSOP's menu ----" + STR$(SYSOP.MENU.SECURITY.LEVEL)
  310.       PRINT "127. Minimum security to leave extended description-" + STR$(ASK.EXTENDED.DESC)
  311.       PRINT "128. Max # security violations before disconnect ---" + STR$(MAXIMUM.VIOLATIONS)
  312.       M22$ = STR$(SYSOP.FUNCTION(1))
  313.       IX = SYSOP.FUNCTION(1)
  314.       FOR I = 2 TO NUM.SYSOP
  315.         IF IX <> SYSOP.FUNCTION(I) THEN _
  316.            M22$ = "(Variable)" : _
  317.            GOTO 12430
  318.       NEXT
  319. 12430 PRINT "129. Security level for SYSOP functions ------------" + M22$
  320.       M23$ = STR$(MAIN.FUNCTION(1))
  321.       IX = MAIN.FUNCTION(1)
  322.       FOR I = 2 TO NUM.MAIN
  323.         IF IX<>MAIN.FUNCTION(I) THEN _
  324.            M23$ = "(Variable)" : _
  325.            GOTO 12440
  326.       NEXT
  327. 12440 PRINT "130. Security level for main menu functions --------" + M23$
  328.       M24$ = STR$(FILES.FUNCTION(1))
  329.       IX = FILES.FUNCTION(1)
  330.       FOR I = 2 TO NUM.FILES
  331.         IF IX<>FILES.FUNCTION(I) THEN _
  332.            M24$ = "(Variable)" : _
  333.            GOTO 12450
  334.       NEXT
  335. 12450 PRINT "131. Security level for file menu functions --------" + M24$
  336.       M25$ = STR$(UTILITY.FUNCTION(1))
  337.       IX = UTILITY.FUNCTION(1)
  338.       FOR I = 2 TO NUM.UTILITY
  339.         IF IX<>UTILITY.FUNCTION(I) THEN _
  340.            M25$ = "(Variable)" : _
  341.            GOTO 12460
  342.       NEXT
  343. 12460 PRINT "132. Security level for utilities menu functions ---" + M25$
  344.       M26$ = STR$(GLOBAL.FUNCTION(1))
  345.       IX = GLOBAL.FUNCTION(1)
  346.       FOR I = 1 TO NUM.GLOBAL
  347.         IF IX<>GLOBAL.FUNCTION(I) THEN _
  348.            M26$ = "(Variable)" : _
  349.            GOTO 12465
  350.       NEXT
  351. 12465 PRINT "133. Security level for GLOBAL commands ------------" + M26$
  352.       PRINT "134. Max # of password changes in a session --------" + STR$(MAXIMUM.PASSWORD.CHANGES)
  353.       PRINT "135. Minimun security for temp. password changes ---" + STR$(MINIMUM.SECURITY.FOR.TEMP.PASSWORD)
  354.       PRINT "136. Minimum security to overwrite on uploads ------" + STR$(OVERWRITE.SECURITY.LEVEL)
  355.       PRINT "137. User's security exempted from 'packing' -------" + STR$(SEC.LVL.EXEMPT.FRM.PURGING)
  356.       PRINT "138. Default security to read new PRIVATE messages -"  + STR$(PRIVATE.READ.SEC)
  357.       PRINT "139. Default security to read new PUBLIC messages --"  + STR$(PUBLIC.READ.SEC)
  358.       PRINT "140. Minimum security to change msg.'s security ----"  + STR$(SEC.CHANGE.MSG)
  359.       GOTO 12580
  360. 12466 DISPLAYED.PAGE.NUMBER = 8
  361.       GOSUB 24800
  362.       LOCATE  3,1
  363.       PRINT "141. Call-back verification ----------------------- " + NOT.YET.IN$ ' CALLBACK.VERIFICATION$
  364.       PRINT "142. Drive/path where personal files & dir stored - " + PERSONAL.DRVPATH$
  365.       PRINT "143. Name of Personal Directory ------------------- " + PERSONAL.DIR$
  366.       PRINT "144. Protocol required for personal downloads ----- " + MID$("<none>  Ascii  XMODEM Xm/CRC Kermit Ymodem Imodem YmodemGWxmodem", 7 * INSTR("NAXCKYIGW",PERSONAL.PROTOCOL$) - 6,7)
  367.       PRINT "145. Files with download security are listed in --- " + FILESEC.FILE$
  368.       PRINT "146. File name with privileged group passwords is - " + PASSWORD.FILE$
  369.       PRINT "147. Concatenate multi-file ASCII downloads ------- " + FNYESNO$(PERSONAL.CONCAT)
  370.       PRINT "148. Min SECURITY to CATEGORIZE uploads -----------" + STR$(SL.CATEGORIZE.UPLOADS)
  371.       PRINT "149. Min security level to view new uploads -------" + STR$(MIN.SEC.TO.VIEW)
  372.       PRINT "150. Security level exempt from 'epi-log' file ----" + STR$(SECURITY.EXEMPT.FROM.EPILOG)
  373.       PRINT "151. Min. security to 'AUTO ADD' conference user --" + AUTO.ADD.SECURITY$
  374.       PRINT "152. Min. security for old caller to turbo logon --" + STR$(ALLOW.CALLER.TURBO)
  375.       PRINT "153. Min. security to describe an existing file ---" + STR$(ADD.DIR.SECURITY)
  376.       PRINT "154. Help file to display for a security violation- " + SECVIO.HLP$
  377.       TIME.LOCK$ = MID$("<none> DOORS  DOWNLDSBOTH   ",TIME.LOCK*7+1,7)
  378.       PRINT "155. Time lock on DOORS and DOWNLOADS ------------- "; TIME.LOCK$
  379.       PRINT "156. Min. sec level exempt from auto-update of sec-" ; AUTO.UPGRADE.SEC
  380.       PRINT "157. Min security to READ & KILL all messages -----" ; SEC.KILL.ANY
  381.       PRINT "158. Do not display messages beginning with ------- "; SCREEN.OUT.MSG$
  382.       GOTO 12580
  383. 12470 DISPLAYED.PAGE.NUMBER = 9
  384.       GOSUB 30040
  385.       ' MAX.USR.FILE.SIZE.FRM.DEF = HIGHEST.USER.RECORD
  386.       MAX.MSG.FILE.SIZE.FRM.DEF! = HIGHEST.MESSAGE.RECORD
  387.       MAX.ALLOWED.MSGS.FRM.DEF  = MAXIMUM.NUMBER.OF.MSGS
  388.       GOSUB 24800
  389.       LOCATE  3,1
  390.       PRINT "161. Maximum number of concurrent RBBS-PC's  -------" + STR$(MAXIMUM.NUMBER.OF.NODES)
  391.       MT$ = "single RBBS-PC copy "
  392.       IF MAXIMUM.NUMBER.OF.NODES <> 1 THEN _
  393.          MT$ = "concurrent RBBS-PC's" : _
  394.          SUBROUTINE.PARAMETER = 2 : _
  395.          IF NETWORK.TYPE < 0 OR NETWORK.TYPE > 7 THEN _
  396.             SUBROUTINE.PARAMETER = 1 : _
  397.             CALL NETTYPE : _
  398.          ELSE CALL NETTYPE
  399.       IF NETWORK.TYPE = 6 THEN _
  400.          MT$ = "NETBIOS             "
  401.       IF NETWORK.TYPE = 7 THEN _
  402.          MT$ = "DoubleDOS           "
  403.       PRINT "162. Environment running " + MT$ + " ------ " + NETWORK.TYPE$
  404.       PRINT "163. RBBS-PC 'recycle' method when users log off --- " + RECYCLE.TO.DOS$
  405.       FILE$ = MAIN.MESSAGE.FILE$
  406.       GOSUB 30180
  407.       MAX.MSG.FILE.SIZE.FRM.DEF! = UG
  408.       PRINT "164. Number of records in the User File ------------";STR$(MAX.USR.FILE.SIZE.FRM.DEF)
  409.       PRINT "165. Number of records in the Message File ---------";STR$(MAX.MSG.FILE.SIZE.FRM.DEF!) ' KG060303
  410.       PRINT "166. Maximum number of messages allowed ------------" + STR$(MAX.ALLOWED.MSGS.FRM.DEF)
  411.       PRINT "167. Conference File Maintenance."
  412.       PRINT "168. Default extension for compressed files -------- " ; DEFAULT.EXTENSION$
  413.       PRINT "169. Additional extensions for compressed files ---- " ; COMPRESSED.EXT$ ' DA050206
  414.       PRINT "170. Message file GROWS in size as messages added -- " ; FNYESNO$(MESSAGES.CAN.GROW)
  415.       GOTO 12580
  416. 12480 DISPLAYED.PAGE.NUMBER = 10
  417.       GOSUB 24800
  418.       RB = 0
  419.       LOCATE  3,1
  420.       PRINT "181. Pack " + MAIN.MESSAGE.FILE$ + " file.
  421.       PRINT "182. Rebuild " + MAIN.USER.FILE$ + " file.
  422.       PRINT "183. Print " + MAIN.MESSAGE.FILE$ + " 'header' records.
  423.       PRINT "184. Renumber messages in " + MAIN.MESSAGE.FILE$ + " file.
  424.       PRINT "185. Repair messages in " + MAIN.MESSAGE.FILE$ + " file.
  425.       PRINT "186. Make all users answer required questionnaire."
  426.       PRINT "187. Check FMS directory structure."
  427.       PRINT "188. Check Personal Download directory structure."
  428.       PRINT "189. Set most critical parameters."
  429.       PRINT "190. Set parameters new to RBBS-PC " + CONFIG.VERSION$
  430.       PRINT "191. Reset active printers for all nodes."
  431.       PRINT "192. Make user pref. on hilighting match color graphics."
  432.       GOTO 12580
  433. 12490 DISPLAYED.PAGE.NUMBER = 11
  434.       GOSUB 24800
  435.       LOCATE  3,1
  436.       PRINT "201. Drive available for uploading files to ------- " + DRIVE.FOR.UPLOADS$ + ":"
  437.       PRINT "202. File name of Upload Directory  --------------- " + UPLOAD.DIRECTORY$
  438.       PRINT "203. Drive/path where Upload Directory stored ----- " + UPLOAD.PATH$
  439.       PRINT "204. Drive(s) available for Downloading ----------- " + DRIVES.FOR.DOWNLOADS$
  440.       PRINT "205. Will you be using DOS sub-directories? ------- " ; FNYESNO$(WILL.SUBDIRS.B.USED)
  441.       PRINT "206. Write Uploads to a DOS sub-directory? -------- " + FNYESNO$(UPLOAD.TO.SUBDIR)
  442.       PRINT "207. Are downloads from DOS sub-directories? ------ " + FNYESNO$(DOWNLOAD.TO.SUBDIR)
  443.       PRINT "208. List, change, add, delete sub-directories."
  444.       PRINT "209. Extension for file directories --------------- " + DIRECTORY.EXTENTION$
  445.       X$ = ALTDIR.EXTENSION$
  446.       IF ALTDIR.EXTENSION$ = "" OR _
  447.          ALTDIR.EXTENSION$ = "<none>" THEN _
  448.          X$ = NONE.PICKED$
  449.       PRINT "210. Alternate extension for directory files ------ " + X$
  450.       PRINT "211. Name (prefix) of directory of directories ---- " + DIRECTORY.PREFIX$
  451.       PRINT "212. Omit directory of directories in N)ew cmnd. -- " + OMIT.MAIN.DIRECTORY$
  452.       X$ = ALWAYS.STREW.TO$
  453.       IF ALWAYS.STREW.TO$ = "" OR _
  454.          ALWAYS.STREW.TO$ = "<none>" THEN _
  455.          X$ = "NO"
  456.       PRINT "213. Copy all upload descriptions to -------------- " + X$
  457.       A$ = FMS.DIRECTORY$
  458.       IF FMS.DIRECTORY$ = "" THEN _
  459.          A$ = NONE.PICKED$
  460.       PRINT "214. Name of master File Management System dir is - " + A$
  461.       PRINT "215. Limit file searches to master FMS dir only --- " ; FNYESNO$(LIMIT.SEARCH.TO.FMS)
  462.       PRINT "216. Default category code for uploads ------------ " + DEFAULT.CATEGORY.CODE$
  463.       PRINT "217. File containing valid directory categories --- " + DIR.CATEGORY.FILE$
  464.       X$ = MASTER.DIRECTORY.NAME$
  465.       IF MASTER.DIRECTORY.NAME$ = "" THEN _
  466.          X$ = "NO"
  467.       PRINT "218. Limit search for 'ALL' dirs to directory ----- " + X$
  468.       PRINT "219. Max length of description of uploaded file ---" + STR$(MAX.DESC.LEN)
  469.       PRINT "220. Drive/path(optional) for directory files ----- " + DIRECTORY.PATH$
  470.       GOTO 12580
  471. 12500 DISPLAYED.PAGE.NUMBER = 12
  472.       GOSUB 24800
  473.       LOCATE 3,1
  474.       PRINT "221. Communications port to be used by RBBS-PC ----" + COM.PORT$
  475.       PRINT "222. # of seconds to wait for modem to initialize -" + STR$(MODEM.INIT.WAIT.TIME)
  476.       PRINT "223. Seconds to wait before issuing modem commands-" + STR$(MODEM.COMMAND.DELAY.TIME)
  477.       PRINT "224. Number of rings to wait before answering -----" + STR$(REQUIRED.RINGS);
  478.       IF INSTR(USER.INIT.COMMAND$, "S0=255 ") > 0 THEN _
  479.          PRINT " RING BACK";
  480.       PRINT
  481.       PRINT "225. Set the modem commands"                            ' KG103101
  482.       PRINT "226. ---------------------------------------------- "
  483.       PRINT "227. Issue modem commands between rings ----------- " ; FNYESNO$(COMMANDS.BETWEEN.RINGS)
  484.       PRINT "228. Baud rate to initially open modem at --------- " + MODEM.INIT.BAUD$
  485.       X$ = STR$(WAIT.BEFORE.DISCONNECT) + " seconds"
  486.       IF WAIT.BEFORE.DISCONNECT = 0 THEN _
  487.          X$ = "NO"
  488.       PRINT "229. Log off user who are idle for ----------------" + X$
  489.       PRINT "230. Are you using a 'DUMB' auto-answer modem? ---- " ; FNYESNO$(DUMB.MODEM)
  490.       PRINT "231. Initialize modem firmware for RBBS-PC."
  491.       PRINT "232. # seconds to wait after dropping DTR ---------"  + STR$(DTR.DROP.DELAY)
  492.       PRINT "233. File with PROTOCOL definitions --------------- " + PROTO.DEF$
  493.       PRINT "234. Always check caller for AUTODOWNLOAD support - " ; FNYESNO$(ASK.IDENTITY)
  494.       PRINT "235. Require non-ascii protocol for BASIC files --- " ; FNYESNO$(REQUIRE.NON.ASCII)
  495.       X$ = STR$(RECYCLE.WAIT) + " minutes"
  496.       IF RECYCLE.WAIT = 0 THEN _
  497.          X$ = "<Don't recycle>"
  498.       PRINT "236. Recycle if no calls are received within ------" + X$
  499.       PRINT "237. Leave modem at initial baud ------------------ " + MID$("YES NO  HIGH",(4*KEEP.INIT.BAUD)+5,4) ' WM042201
  500.       GOTO 12580
  501. 12505 DISPLAYED.PAGE.NUMBER = 13
  502.       GOSUB 24800
  503.       LOCATE 3,1
  504.       PRINT "241. Restore initial parms. after change to N/8/1 - " + FNYESNO$(SWITCH.BACK)
  505.       PRINT "242. Minimum baud required of new callers ---------"  + STR$(MIN.NEWCALLER.BAUD)
  506.       PRINT "243. Minimum baud required of old callers ---------"  + STR$(MIN.OLDCALLER.BAUD)
  507.       PRINT "244. Modem flow control uses Clear-to-Send (CTS)--- " + RTS$
  508.       PRINT "245. Modem flow control uses XON/XOFF ------------- " + FNYESNO$(XON.XOFF)
  509.       PRINT "246. Seconds to wait for carrier after answering --"  + STR$(MAX.CARRIER.WAIT)
  510.       GOTO 12580
  511. 12510 DISPLAYED.PAGE.NUMBER = 14
  512.       GOSUB 24800
  513.       LOCATE 3,1
  514.       TIME.TO.DROP.TO.DOS$ = "<none>"
  515.       IF TIME.TO.DROP.TO.DOS > 0 THEN _
  516.          TIME.TO.DROP.TO.DOS$ = STRING$(4 - (LEN(STR$(TIME.TO.DROP.TO.DOS)) - 1),"0") + MID$(STR$(TIME.TO.DROP.TO.DOS),2)
  517. 12512 PRINT "261. Time of day to exit to DOS ------------------- " + TIME.TO.DROP.TO.DOS$
  518.       PRINT "262. Net mail to invoke is ------------------------ " + NET.MAIL$
  519.       X$ = HOST.ECHO.ON$
  520.       IF HOST.ECHO.ON$ = "" THEN _
  521.          X$ = NONE.PICKED$
  522.       PRINT "263. Command for intermediate host to ECHO -------- " + X$
  523.       X$ = HOST.ECHO.OFF$
  524.       IF HOST.ECHO.OFF$ = "" THEN _
  525.          X$ = NONE.PICKED$
  526.       PRINT "264. Command for intermediate host NOT to ECHO ---- " + X$
  527.       X = INSTR("ICR",DEFAULT.ECHOER$)
  528.       X$ = MID$("Intermediate hostCaller's softwareRBBS-PC",1 + 17 * (X - 1),17)
  529.       PRINT "265. Who echos what a remote caller types? -------- " + X$
  530.       X$ = DEFAULT.LINE.ACK$
  531.       IF DEFAULT.LINE.ACK$ = "" THEN _
  532.          X$ = NONE.PICKED$
  533.       PRINT "266. String to acknowlege line in ASCII upload ---- "+ X$
  534.       PRINT "267. Name of sorted file list used in up/download = "; FAST.FILE.LIST$ ' 102201
  535.       PRINT "268. Name of locator file used in up/download ----- "; FAST.FILE.LOCATOR$ ' 102201
  536.       GOTO 12580
  537. 12520 DISPLAYED.PAGE.NUMBER = 15
  538.       GOSUB 24800
  539.       LOCATE  3,1
  540.       PRINT "281. Let new users set their preferences --------- " ; FNYESNO$(NEWUSER.SETS.DEFAULTS)
  541.       PRINT "282. New users default sign-on mode -------------- " + NOT.YET.IN$ ' NEW.USER.DEFAULT.MODE$
  542.       PRINT "283. New users default file-transfer protocol ---- " + NOT.YET.IN$ ' NEW.USER.DEFAULT.PROTOCOL$
  543.       PRINT "284. Line feeds for new users default to --------- " + NOT.YET.IN$ ' NEW.USER.LINE.FEEDS$
  544.       PRINT "285. Work DRIVE and SUBDIR for View feature------- " + ARKVIEW.PATH$ 'VIEWARC MOD
  545.       PRINT "286. Prompt bell for new users defaults to ------- " + NOT.YET.IN$ ' NEW.USER.BELL$
  546.       PRINT "287. New users 'graphics' capability is assumed -- " + NOT.YET.IN$ ' NEW.USER.GRAPHICS$
  547.       PRINT "288. New users are assumed UPPERCASE only -------- " + NOT.YET.IN$ ' NEW.USER.CASE$
  548.       PRINT "289. New users message margins defaults to ------- " + NOT.YET.IN$ ' STR$(NEW.USER.MARGINS)
  549.       PRINT "290. Add new users to USERS file ----------------- " ; FNYESNO$(REMEMBER.NEW.USERS)
  550.       PRINT "291. Let new users on even when USERS file full -- " ; FNYESNO$(SURVIVE.NOUSER.ROOM)
  551.       GOTO 12580
  552. 12530 DISPLAYED.PAGE.NUMBER = 16
  553.       GOSUB 24800
  554.       LOCATE  3,1
  555.       X$ = LIBRARY.DRIVE$
  556.       IF LIBRARY.DRIVE$ = "" THEN _
  557.          X$ = NONE.PICKED$
  558.       PRINT "301. Library drive ------------------------------- " + X$
  559.       PRINT "302. Drive/Path for Library directory ------------ " + LIBRARY.DIRECTORY.PATH$
  560.       PRINT "303. Extension for Library directory ------------- " + LIBRARY.DIRECTORY.EXTENTION$
  561.       PRINT "304. Drive/Path for Library work/RAM disk -------- " + LIBRARY.WORK.DISK.PATH$
  562.       PRINT "305. # of disks in Library -----------------------" + STR$(LIBRARY.MAX.DISK)
  563.       PRINT "306. # of master Library subdirectories ----------" + STR$(LIBRARY.MAX.DIRECTORY)
  564.       PRINT "307. # of subdirectories in each master ----------" + STR$(LIBRARY.MAX.SUBDIR)
  565.       PRINT "308. Prefix of Library subdirectories ------------ " + LIBRARY.SUBDIR.PREFIX$
  566.       PRINT "309. Name of Library subsystem command menu ------ " + MENU$(6)
  567.       PRINT "310. Symbols to use for Library menu commands ---- " + LIBRARY.COMMANDS$
  568.       M27$ = STR$(PS)
  569.       IX = LIBRARY.FUNCTION(1)
  570.       FOR I = 1 TO NUM.LIBRARY
  571.          IF IX<>LIBRARY.FUNCTION(I) THEN _
  572.             M27$ = "(Variable)" : _
  573.             GOTO 12531
  574.       NEXT
  575. 12531 PRINT "311. Security level for Library menu functions --- " + M27$
  576.       PRINT "312. Drive/Path of archive utility --------------- " + LIBRARY.ARCHIVE.PATH$
  577.       PRINT "313. Name of executable archive utility ---------- " + LIBRARY.ARCHIVE.PROGRAM$
  578.       GOTO 12580
  579. 12540 DISPLAYED.PAGE.NUMBER = 17
  580.       GOSUB 24800
  581.       LOCATE  3,1
  582.       X$ = EMPHASIZE.ON.DEF$
  583.       IF EMPHASIZE.ON.DEF$ = "" THEN _
  584.          X$ = NONE.PICKED$
  585.       PRINT "321. String to turn ON Graphic Emphasis ----------- " + X$
  586.       X$ = EMPHASIZE.OFF.DEF$
  587.       IF EMPHASIZE.OFF.DEF$ = "" THEN _
  588.          X$ = NONE.PICKED$
  589.       PRINT "322. String to restore normal text (Emphasis OFF) - " + X$
  590.       PRINT "323. Caller's Foreground color 1 ------------------ " + FG.1.DEF$
  591.       PRINT "324. Caller's Foreground color 2 ------------------ " + FG.2.DEF$
  592.       PRINT "325. Caller's Foreground color 3 ------------------ " + FG.3.DEF$
  593.       PRINT "326. Caller's Foreground color 4 ------------------ " + FG.4.DEF$
  594.       X$ = MID$("<none>Blue  Green Cyan  Red   PurpleYellowWhite",CALLER.BKGRD*6+1,6)
  595.       PRINT "327. Caller's Background color -------------------- " ; X$
  596.       GOTO 12580
  597. 12550 DISPLAYED.PAGE.NUMBER = 18
  598.       GOSUB 24800
  599.       GOTO 12580
  600. 12580 IF PRE.DISPLAY THEN _
  601.          PRE.DISPLAY = FALSE : _
  602.          GOTO 12622
  603.       GOSUB 24890
  604. 12590 GOSUB 22160
  605. 12592 IF IX THEN _            'IX       Key    Where to branch to
  606.          ON IX GOTO 12360, _  ' 1       F1 - Global Parameters (Part 1)
  607.                     12370, _  ' 2       F2 - Global Parameters (Part 2)
  608.                     12380, _  ' 3       F3 - Global Parameters (Part 3)
  609.                     12390, _  ' 4       F4 - RBBS-PC System Files (Part 1)
  610.                     12400, _  ' 5       F5 - RBBS-PC System Files (Part 2)
  611.                     12410, _  ' 6       F6 - RBBS-PC "doors"
  612.                     12420, _  ' 7       F7 - RBBS-PC security parms. (Part 1)
  613.                     12466, _  ' 8       F8 - RBBS-PC security parms. (Part 2)
  614.                     12470, _  ' 9       F9 - Multiple RBBS-PC parameters
  615.                     12480, _  '10      F10 - RBBS-PC's utilities
  616.                     12490, _  '11 Shift-F1 - RBBS-PC File Manager
  617.                     12500, _  '12 Shift-F2 - RBBS-PC comm. parameters (Part 1)
  618.                     12505, _  '13 Shift-F3 - RBBS-PC comm. parameters (Part 2)
  619.                     12510, _  '14 Shift-F4 - RBBS-PC Net Mail
  620.                     12520, _  '15 Shift-F5 - New user parameters
  621.                     12530, _  '16 Shift-F6 - Library parameters
  622.                     12540, _  '17 Shift-F7 - RBBS-PC Color parameters
  623.                     12310, _  '18 Shift-F8 - Reserved for future use
  624.                     12340, _  '19     PgUp - Go to previous page
  625.                     12330, _  '20     PgDn - Go to next page
  626.                     12630, _  '21      End - Terminate CONFIG
  627.                     12620     '22 Enter - Option selected followed by "enter"
  628.       GOTO 12590
  629. 12620 GOSUB 50340
  630.       IF VAL(HJ$) < 1 OR VAL(HJ$) > 331 THEN _
  631.          GOTO 12580
  632.       IPAGE = INT((VAL(HJ$) - 1) / 20)
  633.       IF DISPLAYED.PAGE.NUMBER <> IPAGE+1 THEN _
  634.          PRE.DISPLAY = TRUE : _
  635.          IX = IPAGE+1 : _
  636.          GOTO 12592
  637. 12622 ILOOKUP = VAL(HJ$) - (20 * IPAGE)
  638.       IPAGE = IPAGE + 1
  639.       IF ILOOKUP < 1 THEN _
  640.          ILOOKUP = 20 : _
  641.          IPAGE = IPAGE - 1
  642. 12630 EXIT SUB
  643. '
  644. ' * COMMON SUBROUTINE TO HANDLE THE FUNCTION KEYS, SCROLL BETWEEN CONFIG'S
  645. ' * PAGES OF OPTIONS, AND USER'S SELECTING A NUMERIC 4-CHARACTER OPTION.
  646. '
  647. 22160 I! = FRE(C$)
  648.       IX = 0
  649.       IF KSTACKED$ = "" THEN _
  650.          GOTO 22161
  651.       X = INSTR(KSTACKED$,CHR$(13))
  652.       IF X > 0 THEN _
  653.          IX = 22 : _
  654.          HJ$ = LEFT$(KSTACKED$,X-1) : _
  655.          KSTACKED$ = RIGHT$(KSTACKED$,LEN(KSTACKED$)-X) : _
  656.          OPTION$ = HJ$ : _
  657.          RETURN
  658.       Y$ = CHR$(0) + CHR$(68)
  659.       IF KSTACKED$ = "END" THEN _
  660.          Y$ = CHR$(0) + CHR$(79)
  661.       KSTACKED$ = ""
  662.       GOTO 22240
  663. 22161 Y$ = INKEY$
  664.       IF LEN(Y$) < 1 THEN _
  665.          GOTO 22161
  666.       IF LEN(Y$) = 2 THEN _               ' IF A FUNCTION KEY, BRANCH
  667.          GOTO 22240
  668.       IF ASC(Y$) = 13 THEN _              ' IF A CARRIAGE RETURN, RETURN
  669.          IX = 22 : _
  670.          RETURN
  671.       IF ASC(Y$) = 8 AND LEN(HJ$) > 0 THEN _
  672.          HJ$ = LEFT$(HJ$,LEN(HJ$) - 1) : _
  673.          PRINT CHR$(29) + " " + CHR$(29); : _
  674.          GOTO 22161
  675.       IF ASC(Y$) < 48 OR ASC(Y$) > 57 THEN _
  676.          GOTO 22161
  677.       PRINT Y$;
  678.       HJ$ = HJ$ + _
  679.             Y$
  680.       OPTION$ = HJ$
  681.       IF LEN(HJ$) > 4 THEN _              ' IF MORE THAN FOUR CHARACTERS,
  682.          IX = 22                          ' RETURN
  683.       RETURN
  684. '
  685. ' * COMMON SUBROUTINE TO HANDLE SET UP RETURN CODES FOR FUNCTION KEYS THAT
  686. ' * WERE PRESSED ON THE LOCAL PC RUNNING CONFIG
  687. '
  688. 22240 IX = ASC(RIGHT$(Y$,1))
  689.       IF IX < 59 OR IX > 91 THEN _        ' IGNORE IF NOT F1 THROUGH F10 OR
  690.          IX = 0: _                        ' SHIFT-F1 THROUGH SHIFT-F8
  691.          RETURN
  692.       IF IX = 73 THEN _                   ' IF PGUP THEN SET IX = 19
  693.          IX = 19 : _
  694.          RETURN
  695.       IF IX = 79 THEN _                   ' IF END THEN SET IX = 21
  696.          IX = 21 : _
  697.          RETURN
  698.       IF IX = 81 THEN _                   ' IF PGDN THEN SET IX = 20
  699.          IX = 20 : _
  700.          RETURN
  701.       IF (IX-58) < 11 THEN _              ' IF F1 THROUGH F10 SET IX = 1
  702.          IX = IX - 58 : _                 ' THROUGH 10 ACCORDINGLY.
  703.          RETURN
  704.       IF (IX-73) > 10 AND _               ' IF SHIFT-F1 THROUGH SHIFT-F8 THEN
  705.          (IX-73) < 19 THEN _              ' SET IX = 11 THROUGH 18
  706.             IX = IX - 73 : _              ' ACCORDINGLY.
  707.             RETURN
  708.       IX = 0
  709.       RETURN
  710. '
  711. ' * ROUTINE TO DISPLAY THE PAGE HEADER FOR CONFIG'S DISPLAYS
  712. '
  713. 24800 CLS
  714.       I! = FRE(C$)
  715.       COLOR 0,7,0
  716.       LOCATE 1,10
  717.       PRINT "RBBS-PC " + CONFIG.VERSION$ + " Configuration ";
  718.       IF CONFERENCE.MODE THEN _
  719.          GOSUB 24970
  720.       COLOR FG,BG,BORDER
  721.       PRINT " Page" + STR$(DISPLAYED.PAGE.NUMBER) + " of" + STR$(MAXIMUM.DISPLAYABLE.PAGES)
  722.       RETURN
  723. 24890 A$ = "Enter parameter # to change, END to update, PgUp/PgDn to scroll:"
  724. 24900 LOCATE 24,5
  725.       PRINT A$;
  726.       X = POS(0) + 2
  727.       PRINT STRING$((75 - LEN(A$)),32);
  728.       LOCATE 24,X
  729.       COLOR FG,BG,BORDER
  730.       HJ$ = "
  731.       I! = FRE(C$)
  732.       RETURN
  733. '
  734. ' * ROUTINE TO DISPLAY CONFERENCE MAINTENANCE MODE IN CONFIG'S DISPLAYS
  735. '
  736. 24970 LOCATE 2,1
  737.       PRINT SPACE$(10)
  738.       LOCATE 2,10
  739.       A$ = "Private"
  740.       IF CONFERENCE.MODE = 2 THEN _
  741.          A$ = "Public"
  742.       PRINT "(" + A$ + " Conference Maintenance Mode for " + _
  743.             MID$(MAIN.MESSAGE.FILE$,1,INSTR(MAIN.MESSAGE.FILE$,"M.DEF")-1) + _
  744.             ")";
  745.       RETURN
  746. '
  747. ' * COMMON SUBROUTINE TO READ THE MESSAGES FILE'S CHECKPOINT RECORD
  748. '
  749. 30040 IF NETWORK.TYPE = 6 THEN _
  750.          OPEN MAIN.MESSAGE.FILE$ FOR RANDOM SHARED AS #2 LEN=128 _
  751.       ELSE OPEN "R",2,MAIN.MESSAGE.FILE$,128
  752.       FIELD 2,128 AS RR$
  753.       GET 2,1
  754.       CALLS.TODATE! = VAL(MID$(RR$,1,8))             '  1-  8  =  number of last message on system
  755.       FIRST.USER.RECORD = VAL(MID$(RR$,52,5))        ' 52- 56  =  first rec. of user file
  756.       CURRENT.USER.COUNT = VAL(MID$(RR$,57,5))       ' 57- 61  =  next avail. user record
  757.       HIGHEST.USER.RECORD = VAL(MID$(RR$,62,5))      ' 62- 66  =  last rec. of user file
  758.       FIRST.MESSAGE.RECORD = VAL(MID$(RR$,68,7))     ' 68- 74 = first rec. of msgs file
  759.       NEXT.MESSAGE.RECORD = VAL(MID$(RR$,75,7))      ' 75- 81 = next avail. msgs record
  760.       HIGHEST.MESSAGE.RECORD = VAL(MID$(RR$,82,7))   ' 82- 88 = last rec. of msgs file
  761.       MAXIMUM.NUMBER.OF.MSGS = VAL(MID$(RR$,89,7))   ' 89- 95 = maximum number of messages
  762.       MAXIMUM.NUMBER.OF.NODES = VAL(MID$(RR$,127,2)) '127-128 = maximum number of "nodes"
  763.       CLOSE 2
  764.       RETURN
  765. '
  766. ' * COMMON ROUTINE TO GET THE LENGTH OF A FILE
  767. '
  768. 30180 IF NETWORK.TYPE = 6 THEN _
  769.          OPEN FILE$ FOR RANDOM SHARED AS #2 LEN=128 _
  770.       ELSE OPEN "R",2,FILE$,128
  771.       FIELD 2,128 AS RR$
  772.       UG = LOF(2) / 128
  773.       CLOSE 2
  774.       RETURN
  775. '
  776. ' * COMMON SUBROUTINE TO KEEP STRING SPACE CLEAN AND CLEAR LINE 24
  777. '
  778. 50340 I! = FRE(C$)
  779.       LOCATE 24,1
  780.       PRINT STRING$(79,32);
  781.       RETURN
  782. '
  783. ' * COMMON SUBROUTINE TO DISPLAY A MESSAGE ON LINE 24
  784. '
  785. 50345 GOSUB 50340
  786.       LOCATE 24,5
  787.       PRINT XX$;
  788.       RETURN
  789. '
  790. ' * COMMON SUBROUTINE TO BEEP AT THE SYSOP
  791. '
  792. 60380 FOR I = 1 TO 3
  793.         BEEP
  794.       NEXT
  795.       RETURN
  796.       END SUB
  797. '  $SUBTITLE: 'NETTYPE - subroutine to select supported networks'
  798. '  $PAGE
  799. '
  800. '  SUBROUTINE NAME    --  NETTYPE
  801. '
  802. '  INPUT PARAMETERS   --  MLCOM
  803. '                         NETWORK.TYPE
  804. '                         NETWORK.TYPE$
  805. '                         SUBROUTINE.PARAMETER
  806. '
  807. '  OUTPUT PARAMETERS  --  MLCOM
  808. '                         NETWORK.TYPE
  809. '                         NETWORK.TYPE$
  810. '
  811. '  SUBROUTINE PURPOSE --  TO SELECT THE RBBS-PC SUPPORTED NETWORKS
  812. '
  813.       SUB NETTYPE STATIC
  814.       ON SUBROUTINE.PARAMETER GOTO 60382,60384
  815. 60382 CLS
  816.       LOCATE 3,1
  817.       PRINT "     RBBS-PC is supported in the following:"
  818.       PRINT "                   Environment"
  819.       PRINT "          0. Single RBBS-PC in an IBM DOS environment"
  820.       PRINT "          1. MultiLink (multi-tasking under single DOS)"
  821.       PRINT "          2. Omninet (CORVUS)"
  822.       PRINT "          3. PC-NET (Orchid)"
  823.       PRINT "          4. DESQview (Quarterdeck)"
  824.       PRINT "          5. 10 NET (Fox Research)"
  825.       PRINT "          6. NETBIOS (DOS SHARE)"
  826.       PRINT "          7. DoubleDOS, but file sharing not supported."
  827. 60383 XX$ = "Select environment (0 to 7, [ENTER] quits)"
  828.       I! = FRE(C$)
  829.       LOCATE 24,1
  830.       PRINT STRING$(79,32);
  831.       LOCATE 24,5
  832.       PRINT XX$;
  833.       LINE INPUT;X$
  834.       IF X$ = "" THEN _
  835.          EXIT SUB
  836.       NETWORK.TYPE = VAL(X$)
  837.       IF NETWORK.TYPE < 0 OR NETWORK.TYPE > 7 THEN _
  838.          GOTO 60383
  839. 60384 IF NETWORK.TYPE = 0 THEN _
  840.          NETWORK.TYPE$ = "IBM's DOS"
  841.       IF NETWORK.TYPE = 1 THEN _
  842.          MLCOM = TRUE : _
  843.          NETWORK.TYPE$ = "MultiLink"
  844.       IF NETWORK.TYPE = 2 THEN _
  845.          NETWORK.TYPE$ = "Omninet"
  846.       IF NETWORK.TYPE = 3 THEN _
  847.          NETWORK.TYPE$ = "PC-NET"
  848.       IF NETWORK.TYPE = 4 THEN _
  849.          NETWORK.TYPE$ = "DESQview"
  850.       IF NETWORK.TYPE = 5 THEN _
  851.          NETWORK.TYPE$ = "10 NET"
  852.       IF NETWORK.TYPE = 6 THEN _
  853.          NETWORK.TYPE$ = "NETBIOS"
  854.       IF NETWORK.TYPE = 7 THEN _
  855.          NETWORK.TYPE$ = "No file sharing!"
  856.       IF SUBROUTINE.PARAMETER = 2 THEN _
  857.          EXIT SUB
  858.       IF NETWORK.TYPE = 2 OR NETWORK.TYPE = 3 OR NETWORK.TYPE = 5 OR NETWORK.TYPE = 6 THEN _
  859.          CALL GETNUMYN ("Are you running Multi-Link with " + NETWORK.TYPE$,MLCOM)
  860.       END SUB
  861. '  $SUBTITLE: 'CNFGINIT - subroutine to initialize CONFIG's constants'
  862. '  $PAGE
  863. '
  864. '  SUBROUTINE NAME    --  CNFGINIT
  865. '
  866. '  INPUT PARAMETERS   --  NONE
  867. '
  868. '  OUTPUT PARAMETERS  --  CONFIG'S CONSTANTS INITIALIZED
  869. '
  870. '  SUBROUTINE PURPOSE --  TO INITIALIZE THE CONSTANTS USED BY CONFIG
  871. '
  872. 60385 SUB CNFGINIT STATIC
  873. '
  874. ' * INITALIZE ALL VARIABLES IF A .DEF FILE DOESN'T AREADY EXIST
  875. '
  876.       D$ = DD$
  877.       DRV$ = LEFT$(D$,1)
  878.       FALSE                      = 0
  879.       TRUE                       = NOT FALSE
  880.       SYSOP.SECURITY.LEVEL       = 10
  881.       ACT.MNTHS.B4.DELETING      = 1
  882.       ACTIVE.BULLETINS           = 6
  883.       ADD.DIR.SECURITY           = SYSOP.SECURITY.LEVEL
  884.       ALLOW.CALLER.TURBO         = 6
  885.       ALTDIR.EXTENSION$          = ""
  886.       ALWAYS.STREW.TO$           = ""
  887.       ANS.MENU$                  = D$ + "MENUA"
  888.       ASK.EXTENDED.DESC          = SYSOP.SECURITY.LEVEL
  889.       ASK.IDENTITY               = FALSE
  890.       AUTO.ADD.SECURITY          = 5
  891.       AUTO.UPGRADE.SEC           = SYSOP.SECURITY.LEVEL
  892.       AUTOPAGE.DEF$              = D$ + "AUTOPAGE.DEF"
  893.       BG                         = 0
  894.       BORDER                     = 0
  895.       BUFFER.SIZE                = 128
  896.       BULLETIN.MENU$             = "BULLET"
  897.       BULLETIN.PREFIX$           = "BULLET"
  898.       BULLETINS.OPTIONAL         = TRUE
  899.       C$                         = ""
  900.       CALLER.BKGRD               = 0
  901.       CALLERS.FILE$              = D$ + "CALLERS"
  902.       SEC.KILL.ANY               = SYSOP.SECURITY.LEVEL
  903.       COM.PORT$                  = "COM1"
  904.       COMMANDS.BETWEEN.RINGS     = FALSE
  905.       COMMANDS.IN.PROMPT         = TRUE
  906.       COMMENTS.AS.MESSAGES       = FALSE
  907.       COMMENTS.FILE$             = D$ + "COMMENTS"
  908.       COMPRESSED.EXT$            = ".ARC.PAK"                        ' DA050206
  909.       COMPUTER.TYPE              = 0
  910.       CONFERENCE.MENU$           = D$ + "CONFENCE"
  911.       CONFERENCE.VIEWER.SEC.LVL  = 0
  912.       CONFMAIL.LIST$             = D$ + "CONFMAIL.DEF"
  913.       CONFIG.VERSION$            = "Version CPC17.3"                ' K092306
  914.       DEFAULT.CATEGORY.CODE$     = "UNC"                            ' KG013102
  915.       DEFAULT.EXTENSION$         = "ZIP"
  916.       DAYS.IN.SUBSCRIPTION.PERIOD = 365
  917.       DAYS.TO.WARN               = 60
  918.       DIR.CATEGORY.FILE$         = D$ + "DIR.CAT"
  919.       DIRECTORY.PREFIX$          = "DIR"
  920.       DEFAULT.ECHOER$            = "R"
  921.       DEFAULT.LINE.ACK$          = ""
  922.       DEFAULT.SECURITY.LEVEL     = 5
  923.       DIRECTORY.EXTENTION$       = "DIR"
  924.       DIRECTORY.PATH$            = D$
  925.       DISK.FOR.DOS$              = D$
  926.       DISKFULL.GO.OFFLINE        = TRUE
  927.       DNLD.SUB                   = 0
  928.       DOORS.AVAILABLE            = FALSE
  929.       DOORS.DEF$                 = D$ + "DOORS.DEF"
  930.       DOORS.TERMINAL.TYPE        = 8
  931.       DOSANSI                    = FALSE
  932.       DOS.VERSION                = 2
  933.       DOWNLOAD.DRIVES$           = DRV$ + DRV$
  934.       DOWNLOAD.TO.SUBDIR         = FALSE
  935.       DRIVE.FOR.BULLETINS$       = D$
  936.       DRIVE.FOR.HELP.FILES$      = D$
  937.       DTR.DROP.DELAY             = 3
  938.       DUMB.MODEM                 = FALSE
  939.       ECHOER$                    = "R"
  940.       EMPHASIZE.OFF.DEF$         = "[27]" + "[0;40;33m"
  941.       EMPHASIZE.ON.DEF$          = "[27]" + "[1;41;37m"
  942.       END.OFFICE.HOURS           = 2200
  943.       ENFORCE.UPLOAD.DOWNLOAD.RATIOS = FALSE
  944.       EPILOG$                    = D$ + "EPILOG.DEF"
  945.       ESCAPE.INSECURE            = FALSE
  946.       EXPERT.USER                = 0
  947.       EXPIRED.SECURITY           = DEFAULT.SECURITY.LEVEL
  948.       EXTENDED.LOGGING           = FALSE
  949.       EXTENSION.LIST$            = "ZIP"                             ' KG013103
  950.       FAST.FILE.LIST$            = D$ + "FIDX.DEF"                   ' KG102201
  951.       FAST.FILE.LOCATOR$         = D$ + "LIDX.DEF"                   ' KG102201
  952.       FC                         = 5
  953.       FG                         = 7
  954.       FG.1.DEF$                  = "Bright Green"
  955.       FG.2.DEF$                  = "Bright Yellow"
  956.       FG.3.DEF$                  = "Bright Purple"
  957.       FG.4.DEF$                  = "Bright Cyan"
  958.       FILE.COMMANDS.DEFAULTS$    = "DGLNPSUV"
  959.       FILE.COMMANDS$             = FILE.COMMANDS.DEFAULTS$
  960.       FILE.NOTIFY                = FALSE
  961.       FILES.FUNCTION$(1,1)       = "D)ownload a file      "
  962.       FILES.FUNCTION$(2,1)       = "G)oodbye              "
  963.       FILES.FUNCTION$(3,1)       = "L)ist file directory  "
  964.       FILES.FUNCTION$(4,1)       = "N)ew file search      "
  965.       FILES.FUNCTION$(5,1)       = "P)ersonal files       "
  966.       FILES.FUNCTION$(6,1)       = "S)earch files         "
  967.       FILES.FUNCTION$(7,1)       = "U)pload a file        "
  968.       FILES.FUNCTION$(8,1)       = "V)erbose archive list "
  969.       FILES.FUNCTION$(1,2)       = "D"
  970.       FILES.FUNCTION$(2,2)       = "G"
  971.       FILES.FUNCTION$(3,2)       = "L"
  972.       FILES.FUNCTION$(4,2)       = "N"
  973.       FILES.FUNCTION$(5,2)       = "P"
  974.       FILES.FUNCTION$(6,2)       = "S"
  975.       FILES.FUNCTION$(7,2)       = "U"
  976.       FILES.FUNCTION$(8,2)       = "V"
  977.       FILESEC.FILE$              = D$ + "FILESEC"
  978.       FIRST.NAME.PROMPT$         = "FIRST name"
  979.       FOSSIL                     = 0
  980.       GB                         = FC
  981.       GLOBAL.COMMANDS.DEFAULTS$  = "H?QX"
  982.       GLOBAL.COMMANDS$           = GLOBAL.COMMANDS.DEFAULTS$
  983.       GLOBAL.FUNCTION$(1,1)      = "H)elp on-line           "
  984.       GLOBAL.FUNCTION$(2,1)      = "?)help on-line (=H)     "
  985.       GLOBAL.FUNCTION$(3,1)      = "Q)uit this part         "
  986.       GLOBAL.FUNCTION$(4,1)      = "X)Expert toggle on/off  "
  987.       GLOBAL.FUNCTION$(1,2)      = "H"
  988.       GLOBAL.FUNCTION$(2,2)      = "?"
  989.       GLOBAL.FUNCTION$(3,2)      = "Q"
  990.       GLOBAL.FUNCTION$(4,2)      = "X"
  991.       GO.TO.SHELL                = TRUE
  992.       HELP$(3)                   = "HELP03"
  993.       HELP$(4)                   = "HELP04"
  994.       HELP$(7)                   = "HELP07"
  995.       HELP$(9)                   = "HELP09"
  996.       HELP.EXTENSION$            = "HLP"
  997.       HELP.FILE.PREFIX$          = "HELP0"
  998.       HELP.PATH$                 = D$
  999.       HOST.ECHO.OFF$             = ""
  1000.       HOST.ECHO.ON$              = ""
  1001.       IB                         = 0
  1002.       KEEP.INIT.BAUD             = FALSE
  1003.       KEEP.TIME.CREDITS          = FALSE
  1004.       LAST.NAME.PROMPT$          = "LAST name"
  1005.       LEN.HASH                   = 31
  1006.       LEN.INDIV                  = 0
  1007.       LIBRARY.ARCHIVE.PATH$        = D$
  1008.       LIBRARY.ARCHIVE.PROGRAM$     = "ARCA "
  1009.       LIBRARY.COMMANDS.DEFAULTS$   = "ACDGLSV"
  1010.       LIBRARY.COMMANDS$            = LIBRARY.COMMANDS.DEFAULTS$
  1011.       LIBRARY.DRIVE$               = ""
  1012.       LIBRARY.MAX.DISK             = 705
  1013.       LIBRARY.MAX.DIRECTORY        = 7
  1014.       LIBRARY.MAX.SUBDIR           = 100
  1015.       LIBRARY.SUBDIR.PREFIX$       = "DISK"
  1016.       LIBRARY.DIRECTORY.PATH$      = D$
  1017.       LIBRARY.DIRECTORY.EXTENTION$ = "CDR"
  1018.       LIBRARY.FUNCTION$(1,1)       = "A)rchive a Library disk  "
  1019.       LIBRARY.FUNCTION$(2,1)       = "C)hange Library disk     "
  1020.       LIBRARY.FUNCTION$(3,1)       = "D)ownload a file         "
  1021.       LIBRARY.FUNCTION$(4,1)       = "G)oodbye                 "
  1022.       LIBRARY.FUNCTION$(5,1)       = "L)ist a file directory   "
  1023.       LIBRARY.FUNCTION$(6,1)       = "S)earch files            "
  1024.       LIBRARY.FUNCTION$(7,1)       = "V)erbose archive list    "
  1025.       LIBRARY.FUNCTION$(1,2)       = "A"
  1026.       LIBRARY.FUNCTION$(2,2)       = "C"
  1027.       LIBRARY.FUNCTION$(3,2)       = "D"
  1028.       LIBRARY.FUNCTION$(4,2)       = "G"
  1029.       LIBRARY.FUNCTION$(5,2)       = "L"
  1030.       LIBRARY.FUNCTION$(6,2)       = "S"
  1031.       LIBRARY.FUNCTION$(7,2)       = "V"
  1032.       LIBRARY.WORK.DISK.PATH$      = D$
  1033.       LIMIT.SEARCH.TO.FMS        = FALSE
  1034.       LOGON.MAIL.LEVEL$          = "A"
  1035.       LSB                        = 1016
  1036. 60390 MACRO.DRVPATH$             = D$
  1037.       MACRO.EXTENSION$           = ""                                ' KG102504
  1038.       MAIN.COMMANDS.DEFAULTS$    = "ABCDEFIJKOPRSTUVW@"
  1039.       MAIN.COMMANDS$             = MAIN.COMMANDS.DEFAULTS$
  1040.       MAIN.FUNCTION$(1,1)        = "A)nswer questionnaire  "
  1041.       MAIN.FUNCTION$(2,1)        = "B)ulletins             "
  1042.       MAIN.FUNCTION$(3,1)        = "C)omments              "
  1043.       MAIN.FUNCTION$(4,1)        = "D)oor subsystem        "
  1044.       MAIN.FUNCTION$(5,1)        = "E)nter message         "
  1045.       MAIN.FUNCTION$(6,1)        = "F)iles subsystem       "
  1046.       MAIN.FUNCTION$(7,1)        = "I)nitial welcome       "
  1047.       MAIN.FUNCTION$(8,1)        = "J)oin a conference     "
  1048.       MAIN.FUNCTION$(9,1)        = "K)ill messages         "
  1049.       MAIN.FUNCTION$(10,1)       = "O)perator page         "
  1050.       MAIN.FUNCTION$(11,1)       = "P)ersonal mail         "
  1051.       MAIN.FUNCTION$(12,1)       = "R)ead messages         "
  1052.       MAIN.FUNCTION$(13,1)       = "S)can messages header  "
  1053.       MAIN.FUNCTION$(14,1)       = "T)opic msg scan        "
  1054.       MAIN.FUNCTION$(15,1)       = "U)tilities subsystem   "
  1055.       MAIN.FUNCTION$(16,1)       = "V)iew conference mail  "
  1056.       MAIN.FUNCTION$(17,1)       = "W)ho's on other nodes  "
  1057.       MAIN.FUNCTION$(18,1)       = "@)Library subsystem    "
  1058.       MAIN.FUNCTION$(1,2)        = "A"
  1059.       MAIN.FUNCTION$(2,2)        = "B"
  1060.       MAIN.FUNCTION$(3,2)        = "C"
  1061.       MAIN.FUNCTION$(4,2)        = "D"
  1062.       MAIN.FUNCTION$(5,2)        = "E"
  1063.       MAIN.FUNCTION$(6,2)        = "F"
  1064.       MAIN.FUNCTION$(7,2)        = "I"
  1065.       MAIN.FUNCTION$(8,2)        = "J"
  1066.       MAIN.FUNCTION$(9,2)        = "K"
  1067.       MAIN.FUNCTION$(10,2)       = "O"
  1068.       MAIN.FUNCTION$(11,2)       = "P"
  1069.       MAIN.FUNCTION$(12,2)       = "R"
  1070.       MAIN.FUNCTION$(13,2)       = "S"
  1071.       MAIN.FUNCTION$(14,2)       = "T"
  1072.       MAIN.FUNCTION$(15,2)       = "U"
  1073.       MAIN.FUNCTION$(16,2)       = "V"
  1074.       MAIN.FUNCTION$(17,2)       = "W"
  1075.       MAIN.MESSAGE.BACKUP$       = D$ + "MESSAGES.BAK"
  1076.       MAIN.MESSAGE.FILE$         = D$ + "MESSAGES"
  1077.       MAIN.PUI$                  = D$ + "MAIN.PUI"
  1078.       MAIN.USER.FILE$            = D$ + "USERS"
  1079.       MASTER.DIRECTORY.NAME$     = ""
  1080.       MAX.ALLOWED.MSGS.FRM.DEF   = 5
  1081.       MAX.CARRIER.WAIT           = 30
  1082.       MAX.DESC.LEN               = 40
  1083.       MAX.EXTENDED.LINES         = 2
  1084.       MAX.MESSAGE.LINES          = 19
  1085.       MAX.PER.DAY                = 0
  1086.       MAX.REG.SEC                = 0
  1087.       MAX.USR.FILE.SIZE.FRM.DEF  = 16
  1088.       MAX.WORK.VAR               = 30
  1089.       MAXD                       = 15
  1090.       MAXIMUM.DISPLAYABLE.PAGES  = 17
  1091.       MAXIMUM.PASSWORD.CHANGES   = 3
  1092.       MAXIMUM.VIOLATIONS         = 5
  1093.       MAXIMUM.NUMBER.OF.NODES    = 1
  1094.       MENU$(1)                   = D$ + "MENU1"
  1095.       MENU$(2)                   = D$ + "MENU2"
  1096.       MENU$(3)                   = D$ + "MENU3"
  1097.       MENU$(4)                   = D$ + "MENU4"
  1098.       MENU$(5)                   = D$ + "MENU5"
  1099.       MENU$(6)                   = D$ + "MENU6"
  1100.       MENUS.CAN.PAUSE            = TRUE
  1101.       MESSAGE.REMINDER           = TRUE
  1102.       MESSAGES.CAN.GROW          = FALSE
  1103.       MIN.NEWCALLER.BAUD         = 0
  1104.       MIN.OLDCALLER.BAUD         = 0
  1105.       MIN.SEC.TO.VIEW            = DEFAULT.SECURITY.LEVEL
  1106.       MINIMUM.LOGON.SECURITY     = 0
  1107.       MINIMUM.SECURITY.FOR.TEMP.PASSWORD = 5
  1108.       MINUTES.PER.SESSION!       = 72
  1109.       MLCOM                      = FALSE
  1110.       MM                         = 5                                 ' KG072303
  1111.       MO$                        = DD$
  1112.       MODEM.ANSWER.COMMAND$      = "ATQ0X1V1A"
  1113.       MODEM.COMMAND.DELAY.TIME   = 1
  1114.       MODEM.COUNT.RINGS.COMMAND$ = "ATS1?"
  1115.       MODEM.GO.OFFHOOK.COMMAND$  = "ATQ1E1H1M0"
  1116.       MODEM.INIT.BAUD$           = "300"
  1117.       MODEM.INIT.COMMAND$        = "ATM0Q1S2=255S10=30E0Q0X1S0=254  "
  1118.       MODEM.INIT.WAIT.TIME       = 2
  1119.       MODEM.RESET.COMMAND$       = "ATZ"
  1120.       MUSIC                      = FALSE
  1121.       NET.MAIL$                  = "<none>"
  1122.       NETWORK.TYPE               = 0
  1123.       NETWORK.TYPE$              = "IBM's DOS"
  1124.       NEW.FILES.CHECK            = FALSE
  1125.       NEW.USER.QUESTIONNAIRE$    = D$ + "RBBS-REG.DEF"
  1126.       NEWUSER.FILE$              = D$ + "NEWUSER"
  1127.       NEWUSER.SETS.DEFAULTS      = TRUE
  1128.       OMIT.MAIN.DIRECTORY$       = "NO"
  1129.       OMIT.UPLOAD.DIRECTORY$     = "NO"
  1130.       OVERWRITE.SECURITY.LEVEL   = SYSOP.SECURITY.LEVEL
  1131.       PAGE.LENGTH                = 23
  1132.       PAGING.PRINTER.SUPPORT$    = ". "
  1133.       PASSWORD.FILE$             = D$ + "PASSWRDS"
  1134.       PCJR                       = FALSE
  1135.       PERSONAL.BEGIN             = 1
  1136.       PERSONAL.DIR$              = D$+"PRIV.DEF"
  1137.       PERSONAL.DRVPATH$          = D$
  1138.       PERSONAL.LEN               = 31
  1139.       PERSONAL.CONCAT            = FALSE
  1140.       PRELOG$                    = D$ + "PRELOG"
  1141.       PRIVATE.READ.SEC           = DEFAULT.SECURITY.LEVEL
  1142.       PROTO.DEF$                 = D$ + "PROTO.DEF"
  1143.       PROMPT.BELL                = 0
  1144.       PROMPT.HASH$               = "Name"
  1145.       PROMPT.INDIV$              = ""
  1146.       PS                         = 5
  1147.       PUBLIC.READ.SEC            = DEFAULT.SECURITY.LEVEL
  1148.       QUES.PATH$                 = D$
  1149.       RBBS.BAT$                  = D$ + "RBBS" + NODE.ID$ + ".BAT"
  1150.       RBBS.NAME$                 = "RBBS-PC"
  1151.       RCTTY.BAT$                 = D$ + "RCTTY" + NODE.ID$ + ".BAT"
  1152.       RECYCLE.TO.DOS             = 0
  1153.       RECYCLE.TO.DOS$            = "INTERNAL"
  1154.       RECYCLE.WAIT               = 0
  1155.       REDIRECT.IO.METHOD         = TRUE
  1156.       REGISTRATION.PROGRAM$      = "<none>"
  1157.       REMEMBER.NEW.USERS         = TRUE
  1158.       REMIND.FILE.TRANSFERS      = FALSE
  1159.       REMIND.PROFILE             = FALSE
  1160.       REQUIRE.NON.ASCII          = TRUE
  1161.       REQUIRED.QUESTIONNAIRE$    = "<none>"
  1162.       REQUIRED.RINGS             = 1
  1163.       RESTRICT.BAUD              = FALSE
  1164.       RESTRICT.BY.DATE           = FALSE
  1165.       RESTRICT.VALID.CMDS        = FALSE
  1166.       RTS$                       = "NO"
  1167.       SCREEN.OUT.MSG$            = "SEEN-BY: "
  1168.       SEC.CHANGE.MSG             = SYSOP.SECURITY.LEVEL
  1169.       SEC.LVL.EXEMPT.FRM.PURGING = SYSOP.SECURITY.LEVEL
  1170.       SECVIO.HLP$                = D$ + "SECVIO." + HELP.EXTENSION$
  1171.       SECURITY.EXEMPT.FROM.EPILOG= DEFAULT.SECURITY.LEVEL + 1
  1172.       SF                         = SYSOP.SECURITY.LEVEL
  1173.       SHOOT.YOURSELF             = FALSE
  1174.       SHOW.SECTION               = TRUE
  1175.       SIZE.OF.STACK              = 1024
  1176.       SL.CATEGORIZE.UPLOADS      = SYSOP.SECURITY.LEVEL
  1177.       SMART.TEXT                 = 123
  1178.       START.HASH                 = 1
  1179.       START.INDIV                = 0
  1180.       START.OFFICE.HOURS         = 800
  1181.       SURVIVE.NOUSER.ROOM        = FALSE
  1182.       SWITCH.BACK                = FALSE
  1183.       SYSOP.COMMANDS.DEFAULTS$   = "1234567"
  1184.       SYSOP.COMMANDS$            = SYSOP.COMMANDS.DEFAULTS$
  1185.       SYSOP.FUNCTION$(1,1)       = " 1 List comments      "
  1186.       SYSOP.FUNCTION$(2,1)       = " 2 List CALLERS log   "
  1187.       SYSOP.FUNCTION$(3,1)       = " 3 Recover a message  "
  1188.       SYSOP.FUNCTION$(4,1)       = " 4 Erase comments     "
  1189.       SYSOP.FUNCTION$(5,1)       = " 5 User maintenance   "
  1190.       SYSOP.FUNCTION$(6,1)       = " 6 Toggle Page bell   "
  1191.       SYSOP.FUNCTION$(7,1)       = " 7 Exit to DOS        "
  1192.       SYSOP.FUNCTION$(1,2)       = " 1"
  1193.       SYSOP.FUNCTION$(2,2)       = " 2"
  1194.       SYSOP.FUNCTION$(3,2)       = " 3"
  1195.       SYSOP.FUNCTION$(4,2)       = " 4"
  1196.       SYSOP.FUNCTION$(5,2)       = " 5"
  1197.       SYSOP.FUNCTION$(6,2)       = " 6"
  1198.       SYSOP.FUNCTION$(7,2)       = " 7"
  1199.       SYSOP.FIRST.NAME$          = "TOM"
  1200.       SYSOP.LAST.NAME$           = "MACK"
  1201.       SYSOP.MENU.SECURITY.LEVEL  = SYSOP.SECURITY.LEVEL
  1202.       SYSOP.PASSWORD.1$          = "RBBS-PC"
  1203.       SYSOP.PASSWORD.2$          = "CPC173"
  1204.       TIME.TO.DROP.TO.DOS        = 0
  1205.       TRASHCAN.FILE$             = D$ + "TRASHCAN"
  1206.       TURN.PRINTER.OFF           = FALSE
  1207.       TURBO.RBBS                 = TRUE
  1208.       UE                         = 5
  1209.       FMS.DIRECTORY$             = ""
  1210.       UPCAT.HELP$                = "UPCAT"
  1211.       UPLOAD.DIRECTORY$          = "99"
  1212.       UPLOAD.PATH$               = D$
  1213.       UPLOAD.SUBDIR$             = ""
  1214.       UPLOAD.TIME.FACTOR!        = 0
  1215.       UPLOAD.TO.SUBDIR           = FALSE
  1216.       USE.BASIC.WRITES           = FALSE
  1217.       USE.DEVICE.DRIVER$         = ""
  1218.       USER.INITIALIZE.COMMAND$   = "AT&C1&D3B1E0V1M0S0=0&T5"
  1219.       USER.FIRMWARE.CLEAR.CMND$  = "AT&F"
  1220.       USER.FIRMWARE.WRITE.CMND$  = "&W"
  1221.       USER.LOCATION$             = "CITY and STATE"
  1222.       UTIL.COMMANDS.DEFAULTS$    = "BCEFGLMPRSTU"
  1223.       UTIL.COMMANDS$             = UTIL.COMMANDS.DEFAULTS$
  1224.       UTILITY.FUNCTION$(1,1)     = "B)aud rate            "
  1225.       UTILITY.FUNCTION$(2,1)     = "C)lock (time)         "
  1226.       UTILITY.FUNCTION$(3,1)     = "E)cho                 "
  1227.       UTILITY.FUNCTION$(4,1)     = "F)ile x-fer protocol  "
  1228.       UTILITY.FUNCTION$(5,1)     = "G)raphics             "
  1229.       UTILITY.FUNCTION$(6,1)     = "L)ines per page       "
  1230.       UTILITY.FUNCTION$(7,1)     = "M)sg margin setting   "
  1231.       UTILITY.FUNCTION$(8,1)     = "P)assword change      "
  1232.       UTILITY.FUNCTION$(9,1)     = "R)eview defaults      "
  1233.       UTILITY.FUNCTION$(10,1)    = "S)tatistics           "
  1234.       UTILITY.FUNCTION$(11,1)    = "T)oggle               "
  1235.       UTILITY.FUNCTION$(12,1)    = "U)ser log scan        "
  1236.       VOICE.TYPE                 = 0
  1237.       VOICE.TYPE$                = NONE.PICKED$
  1238.       XON.XOFF                   = FALSE
  1239.       FOR I = 1 TO LEN(UTIL.COMMANDS.DEFAULTS$)
  1240.          UTILITY.FUNCTION$(I,2) = MID$(UTIL.COMMANDS.DEFAULTS$,I,1)
  1241.       NEXT
  1242.       WAIT.BEFORE.DISCONNECT     = 180
  1243.       WELCOME.FILE$              = D$ + "WELCOME"
  1244.       WELCOME.INTERRUPTABLE      = TRUE
  1245.       WILL.SUBDIRS.B.USED        = FALSE
  1246.       WRITE.BUF.DEF              = 1024
  1247.       FOR I = 1 TO NUM.SYSOP
  1248.          SYSOP.FUNCTION(I) = SF
  1249.       NEXT
  1250.       FOR I = 1 TO NUM.MAIN
  1251.          MAIN.FUNCTION(I) = MM
  1252.       NEXT
  1253.       FOR I = 1 TO NUM.FILES
  1254.          FILES.FUNCTION(I) = FC
  1255.       NEXT
  1256.       FOR I = 1 TO NUM.LIBRARY
  1257.          LIBRARY.FUNCTION(I) = PS
  1258.       NEXT
  1259.       FOR I = 1 TO NUM.UTILITY
  1260.          UTILITY.FUNCTION(I) = UE
  1261.       NEXT
  1262.       FOR I = 1 TO NUM.GLOBAL
  1263.          GLOBAL.FUNCTION(I) = GB
  1264.       NEXT
  1265.       END SUB
  1266. '  $SUBTITLE: 'VOICETYPE - subroutine to select voice'
  1267. '  $PAGE
  1268. '
  1269. '  SUBROUTINE NAME    --  VOICETYPE
  1270. '
  1271. '  INPUT PARAMETERS   --  VOICE.TYPE
  1272. '                         VOICE.TYPE$
  1273. '                         SUBROUTINE.PARAMETER
  1274. '
  1275. '  OUTPUT PARAMETERS  --  VOICE.TYPE
  1276. '                         VOICE.TYPE$
  1277. '
  1278. '  SUBROUTINE PURPOSE --  TO SELECT THE RBBS-PC SUPPORTED VOICE
  1279. '                         SYNTHESIZERS
  1280. '
  1281.       SUB VOICETYPE STATIC
  1282.       ON SUBROUTINE.PARAMETER GOTO 60482,60484
  1283. 60482 CLS
  1284.       LOCATE 3,1
  1285.       PRINT "     RBBS-PC is supported in the following:"
  1286.       PRINT "            Voice Synthesizers"
  1287.       PRINT "          0. None"
  1288.       PRINT "          1. CompuTalker"
  1289.       PRINT "             B.G. MICRO"
  1290.       PRINT "             P.O. Box 280298"
  1291.       PRINT "             Dallas, Texas 75228"
  1292.       PRINT "          2. HearSay 1000"
  1293.       PRINT "             HEARSAY INC."
  1294.       PRINT "             1825 74th Street"
  1295.       PRINT "             Brooklyn, New York 11204"
  1296. 60483 CALL ASKRO("Select environment (0 to 2, [ENTER] quits)",24,X$)
  1297.       IF X$ = "" THEN _
  1298.          EXIT SUB
  1299.       VOICE.TYPE = VAL(X$)
  1300.       IF VOICE.TYPE < 0 OR VOICE.TYPE > 2 THEN _
  1301.          GOTO 60483
  1302. 60484 IF VOICE.TYPE = 0 THEN _
  1303.          VOICE.TYPE$ = NONE.PICKED$
  1304.       IF VOICE.TYPE = 1 THEN _
  1305.          VOICE.TYPE$ = "CompuTalker"
  1306.       IF VOICE.TYPE = 2 THEN _
  1307.          VOICE.TYPE$ = "HearSay 1000"
  1308.       END SUB
  1309. '  $SUBTITLE: 'ASKRO - ask a question at a specific row'
  1310. '  $PAGE
  1311. '
  1312. '  SUBROUTINE NAME    --  ASKRO
  1313. '
  1314. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1315. '                         ANS$           STRING TO PUT THE ANSWER IN
  1316. '                         STRNG$         STRING CONTAINING THE QUESTION
  1317. '                         RO             ROW TO ASK THE QUESTION ON
  1318. '
  1319. '  OUTPUT PARAMETERS  --  ANS$           RESPONSE FROM THE KEYBOARD
  1320. '
  1321. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AT A
  1322. '                         SPECIFIC ROW
  1323. '
  1324.       SUB ASKRO (STRNG$,RO,ANS$) STATIC
  1325. 61100 LOCATE RO,1
  1326.       PRINT SPACE$(79);
  1327.       LOCATE RO,5
  1328.       PRINT STRNG$;" ";
  1329.       LINE INPUT;ANS$
  1330.       END SUB
  1331. '  $SUBTITLE: 'GETINIT - get an integer'
  1332. '  $PAGE
  1333. '
  1334. '  SUBROUTINE NAME    --  GETINIT
  1335. '
  1336. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1337. '                         ANS            WHERE TO PUT THE ANSWER IN
  1338. '                         STRNG$         STRING CONTAINING THE QUESTION
  1339. '                         RO             ROW TO ASK THE QUESTION ON
  1340. '                         MIN            MINIMUM ACCEPTABLE NUMBER
  1341. '                         MAX            MAXIMUM ACCEPTABLE NUMBER
  1342. '
  1343. '  OUTPUT PARAMETERS  --  ANS            RESPONSE FROM THE KEYBOARD
  1344. '
  1345. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AT A
  1346. '                         SPECIFIC ROW AND GET AN INTEGER BACK
  1347. '
  1348.       SUB GETINIT (STRNG$,RO,MIN,MAX,ANS,CR) STATIC
  1349. 61110 LOCATE RO,1
  1350.       CR = FALSE
  1351.       ANS = MIN
  1352.       PRINT SPACE$(79);
  1353.       LOCATE RO,5
  1354.       PRINT STRNG$;" ";
  1355.       LINE INPUT;ANS$
  1356.       IF ANS$ = "" THEN _
  1357.          CR = TRUE : _
  1358.          EXIT SUB
  1359.       IF VAL(ANS$) < MIN OR _
  1360.          VAL(ANS$) > MAX THEN _
  1361.          GOTO 61110
  1362.       ANS = VAL(ANS$)
  1363.       IF ANS = 0 AND LEFT$(ANS$,1) <> "0" THEN _                     ' KG011004
  1364.          GOTO 61110                                                  ' KG011004
  1365.       END SUB
  1366. '  $SUBTITLE: 'GETNUMYN - get a TRUE-FALSE answer to a YES OR NO question'
  1367. '  $PAGE
  1368. '
  1369. '  SUBROUTINE NAME    --  GETNUMYN
  1370. '
  1371. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1372. '                         STRNG$         STRING CONTAINING THE QUESTION
  1373. '
  1374. '  OUTPUT PARAMETERS  --  ANS            Returned value - -1 IF yes, 0 IF no
  1375. '
  1376. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AND GET A
  1377. '                         YES OR NO ANSWER CONVERTED TO TRUE/FALSE
  1378. '
  1379.        SUB GETNUMYN (STRNG$,ANS) STATIC
  1380.        CALL GETYESNO (STRNG$,ANS$)
  1381.        ANS = FNYESNO (ANS$)
  1382.        END SUB
  1383. '  $SUBTITLE: 'GETYESNO - Ask a YES OR NO question'
  1384. '  $PAGE
  1385. '
  1386. '  SUBROUTINE NAME    --  GETYESNO
  1387. '
  1388. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1389. '                         ANS$           STRING TO PUT THE ANSWER IN
  1390. '                         STRNG$         STRING CONTAINING THE QUESTION
  1391. '
  1392. '  OUTPUT PARAMETERS  --  ANS$           RESPONSE FROM THE KEYBOARD
  1393. '
  1394. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AND GET A
  1395. '                         YES OR NO ANSWER
  1396. '
  1397.       SUB GETYESNO (STRNG$,ANS$) STATIC
  1398. 61200 CALL ASKRO (STRNG$+" Y)es or N)o",24,HJ$)                      ' RS060401
  1399.       L = LEN(HJ$)
  1400.       IF L < 1 OR L > 3 THEN _
  1401.          GOTO 61207
  1402.       CALL ALLCAPS(HJ$)
  1403.       X = INSTR("NY",LEFT$(HJ$,1))
  1404.       ON X GOTO 61210,61212
  1405. 61207 BEEP
  1406.       GOTO 61200
  1407. 61210 ANS$ = "NO"
  1408.       EXIT SUB
  1409. 61212 ANS$ = "YES"
  1410.       EXIT SUB
  1411.       END SUB
  1412. '  $SUBTITLE: 'ALLCAPS - convert a sting into all capital letters'
  1413. '  $PAGE
  1414. '
  1415. '  SUBROUTINE NAME    --  ALLCAPS
  1416. '
  1417. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1418. '                         STRNG$         STRING CONTAINING THE QUESTION
  1419. '
  1420. '  OUTPUT PARAMETERS  --  STRNG$         CAPITALIZED STRING
  1421. '
  1422. '  SUBROUTINE PURPOSE --  TO CAPITALIZE A STRING
  1423. '
  1424.       SUB ALLCAPS (STRNG$) STATIC
  1425. ' ************************************* OLD CODE form 17-3 *********
  1426. '      FOR Z = 1 TO LEN(STRNG$)
  1427. '        MID$(STRNG$,Z,1) = CHR$(ASC(MID$(STRNG$,Z,1)) + _
  1428. '                           32 * (ASC(MID$(STRNG$,Z,1)) > 96))
  1429. '      NEXT
  1430. '
  1431. '******** NEW ALLCAPS CODE...Pe 10/22/89 ***************************
  1432.  FOR Z = 1 TO LEN(STRNG$)
  1433.    TH = ASC(MID$(STRNG$, Z, 1))
  1434.     IF TH > 96 AND TH < 123 THEN _
  1435.          MID$(STRNG$, Z, 1) = CHR$(TH - 32)
  1436.       NEXT Z
  1437.       END SUB
  1438. '  $SUBTITLE: 'ASKUPOS - find the unique user field for USERS'
  1439. '  $PAGE
  1440. '
  1441. '  SUBROUTINE NAME    --  ASKUPOS
  1442. '
  1443. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1444. '                         HDR$           HEADER
  1445. '                         BEGIN.COL      BEGINNING COLUMN OF FIELD
  1446. '                         FIELD.LEN      LENGTH OF FIELD IN USER'S RECORD
  1447. '                         PRMPT$         PROMPT TO GIVE FOR FIELD
  1448. '
  1449. '  OUTPUT PARAMETERS  --  ABOVE INPUTS UPDATED WITH USER'S RESPONSES
  1450. '
  1451. '  SUBROUTINE PURPOSE --  TO ASK THE SYSOP WHAT UNIQUE FIELD IN THE USERS
  1452. '                         RECORD IS TO BE ASKED FOR AT LOGON
  1453. '
  1454.       SUB ASKUPOS (HDR$,BEGIN.COL,FIELD.LEN,PRMPT$) STATIC
  1455.       CLS
  1456.       LOCATE 3,20
  1457.       PRINT HDR$;
  1458. 61300 LOCATE 6,5
  1459.       PRINT "1.  BEGINNING COLUMN in USERS file";TAB(44);STR$(BEGIN.COL);"   ";
  1460.       LOCATE 8,5
  1461.       PRINT "2.  Number of CHARACTERS to use";TAB(44);STR$(FIELD.LEN);"   ";
  1462.       LOCATE 10,5
  1463.       PRINT "3.  PROMPT to display to callers";TAB(45);PRMPT$;SPACE$(34-LEN(PRMPT$));
  1464. 61310 CALL ASKRO ("Select option to change (1-3, ENTER to end)",24,X$)
  1465.       IF X$ = "" THEN _
  1466.          EXIT SUB
  1467.       X = VAL(X$)
  1468.       IF X < 1 OR X > 3 THEN _
  1469.          GOTO 61310
  1470.       ON X GOTO 61320,61330,61340
  1471. 61320 CALL ASKRO ("New BEGINNING COLUMN",24,HJ$)
  1472.       IF HJ$ = "" THEN _
  1473.          GOTO 61320
  1474.       X = VAL(HJ$)
  1475.       IF X < 0 OR X > 128 THEN _
  1476.          GOTO 61320
  1477.       BEGIN.COL = X
  1478.       GOTO 61300
  1479. 61330 CALL ASKRO ("New # CHARACTERS to use",24,HJ$)
  1480.       IF HJ$ = "" THEN _
  1481.          GOTO 61330
  1482.       X = VAL(HJ$)
  1483.       IF X < 0 OR X > 31 THEN _
  1484.          GOTO 61330
  1485.       FIELD.LEN = X
  1486.       GOTO 61300
  1487. 61340 CALL ASKRO ("New PROMPT",24,HJ$)
  1488.       IF LEN(HJ$) > 34 THEN _
  1489.          GOTO 61340
  1490.       PRMPT$ = HJ$
  1491.       GOTO 61300
  1492.       END SUB
  1493. '  $SUBTITLE: 'ANYNUMBER - input any numeric value'
  1494. '  $PAGE
  1495. '
  1496. '  SUBROUTINE NAME    --  ANYNUMBER
  1497. '
  1498. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1499. '                         PRMPT$           PROMPT
  1500. '
  1501. '  OUTPUT PARAMETERS  --  RETURNED.VALUE!  VALUE RETURNED
  1502. '
  1503. '  SUBROUTINE PURPOSE --  TO GET A NUMERIC VALUE
  1504. '
  1505.       SUB ANYNUMBER (PRMPT$,RETURNED.VALUE!) STATIC
  1506. 61400 CALL ASKRO (PRMPT$,24,HJ$)
  1507.       RETURNED.VALUE! = VAL(HJ$)
  1508.       END SUB
  1509. '  $SUBTITLE: 'ANYINTEGER - input any integer value'
  1510. '  $PAGE
  1511. '
  1512. '  SUBROUTINE NAME    --  ANYINTEGER
  1513. '
  1514. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1515. '                         PRMPT$           PROMPT TO DISPLAY
  1516. '
  1517. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1518. '
  1519. '  SUBROUTINE PURPOSE --  TO GET AN INTEGER VALUE
  1520. '
  1521.       SUB ANYINTEGER (PRMPT$,RETURNED.VALUE) STATIC
  1522. 61450 CALL ANYNUMBER (PRMPT$,RETURNED.VALUE!)
  1523.       IF RETURNED.VALUE! >  32767.0 OR _
  1524.          RETURNED.VALUE! < -32767.0 THEN_
  1525.          BEEP : _
  1526.          GOTO 61450
  1527.       RETURNED.VALUE = RETURNED.VALUE!
  1528.       END SUB
  1529. '  $SUBTITLE: 'MMINTEGER - input any integer value with range check'
  1530. '  $PAGE
  1531. '
  1532. '  SUBROUTINE NAME    --  MMINTEGER
  1533. '
  1534. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1535. '                         PRMPT$           PROMPT
  1536. '                         MIN              MINIMUM VALUE (INCLUSIVE)
  1537. '                         MAX              MAXIMUM VALUE (INCLUSIVE)
  1538. '
  1539. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1540. '
  1541. '  SUBROUTINE PURPOSE --  TO GET AN INTEGER VALUE WITHIN A RANGE
  1542. '
  1543.       SUB MMINTEGER (PRMPT$,MIN,MAX,RETURNED.VALUE) STATIC
  1544. 61500 CALL ANYINTEGER (PRMPT$,RETURNED.VALUE)
  1545.       IF RETURNED.VALUE < MIN OR RETURNED.VALUE > MAX THEN _
  1546.          BEEP : _
  1547.          GOTO 61500
  1548.       END SUB
  1549. '  $SUBTITLE: 'MMREAL - input any single precision real # with range check'
  1550. '  $PAGE
  1551. '
  1552. '  SUBROUTINE NAME    --  MMREAL
  1553. '
  1554. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1555. '                         PRMPT$           PROMPT
  1556. '                         MIN!             MINIMUM VALUE (INCLUSIVE)
  1557. '                         MAX!             MAXIMUM VALUE (INCLUSIVE)
  1558. '
  1559. '  OUTPUT PARAMETERS  --  RETURNED.VALUE!  VALUE RETURNED
  1560. '
  1561. '  SUBROUTINE PURPOSE --  TO GET AN REAL # VALUE WITHIN A RANGE
  1562. '
  1563.       SUB MMREAL (PRMPT$,MIN!,MAX!,RETURNED.VALUE!) STATIC           ' KG090102
  1564. 61550 CALL ANYNUMBER (PRMPT$,RETURNED.VALUE!)                        ' KG090102
  1565.       IF RETURNED.VALUE! < MIN! OR RETURNED.VALUE! > MAX! THEN _     ' KG090102
  1566.          BEEP : _                                                    ' KG090102
  1567.          GOTO 61550                                                  ' KG090102
  1568.       END SUB                                                        ' KG090102
  1569. '  $SUBTITLE: 'FINDFILE - Determine whether a file exists'
  1570. '  $PAGE
  1571. '
  1572. '  SUBROUTINE NAME    --  FINDFILE
  1573. '
  1574. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1575. '                         FILNAME$         FILE TO LOOK FOR
  1576. '                         FEXISTS          WHETHER FILE EXISTS
  1577. '
  1578. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1579. '
  1580. '  SUBROUTINE PURPOSE --  DETERMINE WHETHER PASSED FILE NAME EXISTS
  1581. '                         RETURN TRUE OR FALSE IN "FEXISTS"
  1582. '
  1583.       SUB FINDFILE (FILNAME$,FEXISTS) STATIC
  1584. 61600 CALL RBBSFIND (FILNAME$,Z,Y,M,D)
  1585.       FEXISTS = (Z = 0)
  1586.       END SUB
  1587. '  $SUBTITLE: 'CHKFMSDIR - Validate structure of FMS directory'
  1588. '  $PAGE
  1589. '
  1590. '  SUBROUTINE NAME    --  CHKFMSDIR
  1591. '
  1592. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1593. '                         FMSDIR$         NAME OF FMS DIRECTORY
  1594. '                         LINELEN         PROPER LENGTH OF LINES
  1595. '                                         (EXCLUDING CR/LF AT END)
  1596. '                         FMS.DIRCAT$     CATEGORY FILE FOR FMS
  1597. '
  1598. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1599. '
  1600. '  SUBROUTINE PURPOSE --  VERIFIES THAT FMS IS IN VALID FORMAT
  1601. '                         AND DIAGNOSES PROBLEMS
  1602. '
  1603. 61700 SUB CHKFMSDIR (FMSDIR$,LINELEN,FMS.DIRCAT$) STATIC
  1604.       DIM CAT.CODE$(99)
  1605.       CLS
  1606.       LOCATE 5,20
  1607.       PRINT "Checking FMS file ";FMSDIR$;
  1608.       NLINES = 0
  1609.       LOCATE 7,27
  1610.       PRINT "Line #";
  1611.       LOCATE 9,20
  1612.       COLOR 0,7
  1613.       PRINT " Last Line with an ERROR ";
  1614.       LOCATE 12,28
  1615.       PRINT " Last ERROR ";
  1616.       COLOR 7,0
  1617.       NCATS = 0
  1618.       CALL FINDFILE (FMS.DIRCAT$,FEXISTS)
  1619.       IF FEXISTS THEN _
  1620.          NCATS = 1:_
  1621.          CAT.CODE$(1) = "***":_
  1622.          OPEN FMS.DIRCAT$ FOR INPUT AS #2 : _
  1623.          WHILE NOT EOF(2) AND NCATS < UBOUND(CAT.CODE$) :_
  1624.             NCATS = NCATS + 1:_
  1625.             INPUT #2,X$,Y$,X$:_
  1626.             CAT.CODE$(NCATS) = Y$:_
  1627.          WEND:_
  1628.          CLOSE 2
  1629.       GO.ON = -1
  1630.       CALL FINDFILE (FMSDIR$,FEXISTS)
  1631.       IF NOT FEXISTS THEN _
  1632.          LOCATE 6,25 : _
  1633.          PRINT "File not found"; : _
  1634.          GOTO 61750
  1635.       OPEN FMSDIR$ FOR INPUT AS #2
  1636.       WHILE NOT EOF(2) AND GO.ON
  1637.          NLINES = NLINES + 1
  1638.          LINE INPUT #2, A$
  1639.          L = LEN(A$)
  1640.          LOCATE 7,36
  1641.          PRINT NLINES;
  1642.          IF L > LINELEN THEN _
  1643.             CALL HANDERR (A$,NLINES,"Too LONG: has" + STR$(L) + " chars but should have" + STR$(LINELEN),GO.ON):_
  1644.             IF NOT GO.ON THEN _
  1645.                GOTO 61740
  1646.          IF L < LINELEN THEN _
  1647.             X$ = "Too SHORT: has" + STR$(L) + " chars but should have" + STR$(LINELEN) : _
  1648.             CALL HANDERR (A$,NLINES,X$,GO.ON):_
  1649.             IF NOT GO.ON THEN _
  1650.                GOTO 61740
  1651.          IF L > 0 THEN _
  1652.             IF INSTR ("\* ",LEFT$(A$,1)) THEN _
  1653.                GOTO 61740
  1654.          IF L > 30 THEN _
  1655.             X$ = MID$(A$,24,2) + _
  1656.                  MID$(A$,27,2) + _
  1657.                  MID$(A$,30,2) : _
  1658.             I = 1 : _
  1659.             WHILE I < 7 AND INSTR("0123456789",MID$(X$,I,1)) > 0 : _
  1660.                I = I + 1: _
  1661.             WEND: _
  1662.             IF I < 7 THEN _
  1663.                CALL HANDERR (A$,NLINES,"INVALID CHARACTER <" + MID$(X$,I,1) + "> in date field",GO.ON) : _
  1664.                IF NOT GO.ON THEN _
  1665.                   GOTO 61740
  1666.          I = 1
  1667.          Y$ = MID$(A$,L - 2)
  1668.          CALL REMOVE (Y$," ")
  1669.          WHILE I <= NCATS AND Y$ <> CAT.CODE$(I)
  1670.             I = I + 1
  1671.          WEND
  1672.          IF I > NCATS THEN _
  1673.             CALL HANDERR (A$,NLINES,"Category code <" + Y$ + "> NOT IN " + FMS.DIRCAT$,GO.ON)
  1674. 61740 WEND
  1675. 61750 CLOSE 2
  1676.       IF GO.ON THEN _
  1677.          LOCATE 15,15:_
  1678.          BEEP:_
  1679.          CALL ASKRO ("           Done checking.  Press [ENTER] to continue",20,ANS$)
  1680.       END SUB
  1681. '  $SUBTITLE: 'CHKPERSDIR - Validate personal directories'
  1682. '  $PAGE
  1683. '
  1684. '  SUBROUTINE NAME    --  CHKPERSDIR
  1685. '
  1686. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1687. '                         PDIR$           NAME OF PERSONAL DIRECTORY
  1688. '                         NAMELEN         PROPER LENGTH OF NAME FIELD
  1689. '
  1690. '  OUTPUT PARAMETERS  --  NONE
  1691. '
  1692. '  SUBROUTINE PURPOSE --  CHECKS PERSONAL DIRECTORY FOR PROPER FORMAT
  1693. '
  1694. 61755 SUB CHKPERSDIR (PDIR$, DESC.LEN, NAMELEN) STATIC
  1695.       CLS
  1696.       LOCATE 5, 21
  1697.       PRINT "Checking Personal Directory "; PDIR$;
  1698.       NLINES = 0
  1699.       LOCATE 7, 27
  1700.       PRINT "Line #";
  1701.       LOCATE 9, 20
  1702.       COLOR 0, 7
  1703.       PRINT " Last Line with an ERROR ";
  1704.       LOCATE 12, 28
  1705.       PRINT " Last ERROR ";
  1706.       COLOR 7, 0
  1707.       GO.ON = -1
  1708.       CALL FINDFILE(PDIR$, FEXISTS)
  1709.       IF NOT FEXISTS THEN _
  1710.          LOCATE 6, 25: _
  1711.          PRINT "File not found"; : _
  1712.          GOTO 61775
  1713.       LINELEN = 34 + DESC.LEN + NAMELEN
  1714.       OPEN PDIR$ FOR INPUT AS #2
  1715.       WHILE NOT EOF(2) AND GO.ON
  1716.          NLINES = NLINES + 1
  1717.          LINE INPUT #2, A$
  1718.          L = LEN(A$)
  1719.          LOCATE 7, 36
  1720.          PRINT NLINES;
  1721.          IF L > LINELEN THEN _
  1722.             CALL HANDERR(A$, NLINES, "Too LONG: has" + STR$(L) + " chars but should have" + STR$(LINELEN), GO.ON) : _
  1723.             IF NOT GO.ON THEN _
  1724.                GOTO 61770
  1725.          IF L < LINELEN THEN _
  1726.             CALL HANDERR(A$, NLINES, "Too SHORT: has" + STR$(L) + " chars but should have" + STR$(LINELEN), GO.ON) : _
  1727.                IF NOT GO.ON THEN _
  1728.                   GOTO 61770
  1729.          IF L > 30 THEN _
  1730.             X$ = MID$(A$, 24, 2) + MID$(A$, 27, 2) + MID$(A$, 30, 2) : _
  1731.             I = 1 : _
  1732.             WHILE I < 7 AND INSTR("0123456789", MID$(X$, I, 1)) > 0 : _
  1733.                I = I + 1 : _
  1734.             WEND : _
  1735.             IF I < 7 THEN _
  1736.                CALL HANDERR(A$, NLINES, "INVALID CHARACTER <" + MID$(X$, I, 1) + "> in date field", GO.ON) : _
  1737.                IF NOT GO.ON THEN _
  1738.                   GOTO 61770
  1739.            IF L = LINELEN THEN _
  1740.               X$ = RIGHT$(A$, 1) : _
  1741.               IF INSTR("*!", X$) = 0 THEN _
  1742.                  CALL HANDERR(A$, NLINES, "Last char on line should be * or ! but found <" + X$ + ">", GO.ON) : _
  1743.                  IF NOT GO.ON THEN  _
  1744.                     GOTO 61770
  1745.            IF L = LINELEN THEN _
  1746.               X$ = MID$(A$, L - NAMELEN, LINELEN) : _
  1747.               IF LEFT$(X$, 1) = " " THEN _
  1748.                  IF INSTR("0123456789-", MID$(X$, 2, 1)) = 0 THEN _
  1749.                     CALL HANDERR(A$, NLINES, "Name field at col" + STR$(L - NAMELEN) + " has <" + LEFT$(X$, 1) + ">, needs non-blank or blank+number", GO.ON) : _
  1750.                     IF NOT GO.ON THEN _
  1751.                        GOTO 61770
  1752. 61770 WEND
  1753. 61775 CLOSE 2
  1754.       IF GO.ON THEN _
  1755.          LOCATE 15, 15 : _
  1756.          BEEP : _
  1757.          CALL ASKRO("           Done checking.  Press [ENTER] to continue", 20, ANS$)
  1758.       END SUB
  1759. '  $SUBTITLE: 'HANDERR - subroutine to handle FMS errors'
  1760. '  $PAGE
  1761. '
  1762. '  SUBROUTINE NAME    -- HANDERR
  1763. '
  1764. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1765. '                        ERRLINE$                LINE THAT HAS THE ERROR
  1766. '                        ERRL                    LINE NUMBER WITH ERROR
  1767. '                        ERRMES$                 ERROR MESSAGE TO ISSUE
  1768. '
  1769. '  OUTPUT PARAMETERS  -- GO.ON                   INIDCATE TO PROCEDURE OR NOT
  1770. '
  1771. '  SUBROUTINE PURPOSE -- TO HANDLE ERROR CHECKING OF THE FMS DIRECTORY
  1772. '
  1773.       SUB HANDERR (ERRLINE$,ERRL,ERRMES$,GO.ON) STATIC
  1774.       LOCATE 10,1
  1775.       PRINT SPACE$(80);
  1776.       LOCATE 10,1
  1777.       PRINT ERRLINE$;
  1778.       LOCATE 9,45
  1779.       PRINT STR$(ERRL);
  1780.       LOCATE 13,1
  1781.       PRINT SPACE$(79);
  1782.       L = LEN(ERRMES$)
  1783.       IF L > 68 THEN _
  1784.          STRT = 1 _
  1785.       ELSE STRT = (70 - L) / 2
  1786.       LOCATE 13,STRT
  1787.       PRINT ERRMES$;
  1788.       CALL ASKRO ("               CONTINUE checking (Y/N,[ENTER]=Y) ",20,ANS$)
  1789.       IF ANS$ = "" THEN _
  1790.          ANS$ = "Y"
  1791.       CALL ALLCAPS (ANS$)
  1792.       GO.ON = FNYESNO (ANS$)
  1793.       END SUB
  1794. ' $SUBTITLE: 'REMOVE - subroutine to delete a string from within a string'
  1795. ' $PAGE
  1796. '
  1797. '  SUBROUTINE NAME    -- REMOVE
  1798. '
  1799. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1800. '                        BADSTRING$              STRING CONTAINING CHARACTERS
  1801. '                                                TO BE DELETED FROM "L$"
  1802. '                        L$                      STRING TO BE ALTERED
  1803. '
  1804. '  OUTPUT PARAMETERS  -- L$                      WITH THE CHARACTERS IN
  1805. '                                                "BADSTRING#" DELETED FROM IT
  1806. '
  1807. '  SUBROUTINE PURPOSE -- TO REMOVE ALL INSTANCES OF THE CHARACTERS IN
  1808. '                        "BADSTRING$" FROM "L$"
  1809. '
  1810.       SUB REMOVE (L$,BADSTRNG$) STATIC
  1811. 61800 J = 0
  1812.       FOR I = 1 TO LEN(L$)
  1813.          IF INSTR(BADSTRNG$,MID$(L$,I,1)) = 0 THEN_
  1814.             J = J + 1:_
  1815.             MID$(L$,J,1) = MID$(L$,I,1)
  1816.       NEXT I
  1817.       L$ = LEFT$(L$,J)
  1818.       END SUB
  1819. ' $SUBTITLE: 'GETASCII - subroutine to prompt for any ASCII values'
  1820. ' $PAGE
  1821. '
  1822. '  SUBROUTINE NAME    -- GETASCII
  1823. '
  1824. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1825. '                        TITLE$                  HEADER EXPANATION FOR PARAM
  1826. '
  1827. '  OUTPUT PARAMETERS  -- STRNG$                  RESULTANT CONFIG PARAMETER
  1828. '
  1829. '  SUBROUTINE PURPOSE -- ALLOWS ANY ASCII CHARACTER TO BE STORED IN A PARAMETER
  1830. '                        BY ENCLOSING IT IN SQUARE BRACKETS.  CHARACTERS NOT IN
  1831. '                        SQUARE BRACKETS ARE INTERPRETED EXACTLY AS ENTERED.
  1832. '                        CHARACTER'S ASCII VALUE EQUAL THE NUMERIC VALUE IN THE
  1833. '                        SQUARE BRACKETS.
  1834. '
  1835.       SUB GETASCII (TITLE$,STRNG$) STATIC
  1836. 61810 CLS
  1837.       LOCATE 8,30
  1838.       PRINT TITLE$;
  1839.       LOCATE 13,5
  1840.       PRINT "Current value is"
  1841.       PRINT STRNG$
  1842.       PRINT
  1843.       PRINT "Please enter the new values by entering the character"
  1844.       PRINT "or enclosing its ASCII value in square brackets:"
  1845.       PRINT "(Press ENTER to make empty)
  1846.       LINE INPUT "";HJ$
  1847.       STRNG$ = HJ$
  1848.       END SUB
  1849. ' $SUBTITLE: 'BRKFNAME - subroutine to decompose a file name'
  1850. ' $PAGE
  1851. '
  1852. '  SUBROUTINE NAME    -- BRKFNAME
  1853. '
  1854. '  INPUT PARAMETERS   -- PARAMETER                     MEANING
  1855. '                        FILENAME$       NAME OF THE FILE TO BE DECOMPOSED
  1856. '                        FOR.JOINING     INDICATOR IF OUTPUT IS TO BE COMPBINED
  1857. '
  1858. '  OUTPUT PARAMETERS  -- DRVPATH$        DRIVE AND PATH
  1859. '                        PREFIX$         8-CHARACTER FILE NAME PREFIX
  1860. '                        EXTENSION$      3-CHARACTER EXTENSION
  1861. '
  1862. '  SUBROUTINE PURPOSE -- BREAKS DOWN A FILE NAME INTO A DRIVE AND PATH,
  1863. '                        FILE PREFIX (8 CHARACTERS), AND FILE EXTENSION
  1864. '                        (3 CHARACTERS).  IF "FOR.JOINING" IS TRUE, THE
  1865. '                        DRIVE AND PATH HAVE A ":" AND A "\" IN IT AND
  1866. '                        THE EXTENSION BEGINS WITH A ".".
  1867. '
  1868.       SUB BRKFNAME (FILENAME$,DRVPATH$,PREFIX$,EXTENSION$,FOR.JOINING) STATIC
  1869. 61830 CALL ALLCAPS (FILENAME$)
  1870.       DRVPATH$ = ""
  1871.       PREFIX$ = ""
  1872.       EXTENSION$ = ""
  1873.       CALL TRIMTRAIL (FILENAME$,"\")
  1874.       IF LEN(FILENAME$) < 1 THEN _
  1875.          EXIT SUB
  1876.       CALL FINDLAST (FILENAME$,"\",X,Y)
  1877.       IF X < 1 THEN _
  1878.          IF MID$(FILENAME$,2,1) = ":" THEN _
  1879.             DRVPATH$ = LEFT$(FILENAME$,1): _
  1880.             S = 3 _
  1881.          ELSE S = 1 _
  1882.       ELSE DRVPATH$ = LEFT$(FILENAME$,X - 1) : _
  1883.            S = X + 1
  1884.       X = INSTR(FILENAME$+".",".")
  1885.       EXTENSION$ = MID$(FILENAME$,X + 1,3)
  1886.       PREFIX$ = MID$(FILENAME$,S,X - S)
  1887.       IF NOT FOR.JOINING THEN _
  1888.          EXIT SUB
  1889.       IF LEN(DRVPATH$) = 1 THEN _
  1890.          DRVPATH$ = DRVPATH$ + ":"
  1891.       IF INSTR(DRVPATH$,"\") > 0 THEN _
  1892.          DRVPATH$ = DRVPATH$ + "\"
  1893.       IF LEN(EXTENSION$) > 0 THEN _
  1894.          EXTENSION$ = "." + EXTENSION$
  1895.       END SUB
  1896. '
  1897. '  $SUBTITLE: 'TRIMTRAIL - subroutine to trim off trailing characters'
  1898. '  $PAGE
  1899. '
  1900. '  SUBROUTINE NAME    --  TRIMTRAIL
  1901. '
  1902. '  INPUT PARAMETERS   --  PARAMETER           MEANING
  1903. '                         TRIM.PARM$  TIME IN SECONDS AFTER MIDNIGHT TO WAIT
  1904. '                                     BEFORE DISPLAYING
  1905. '                         TRIM.THIS$  WHAT CHARACTER TO TRIM OFF END
  1906. '
  1907. '  OUTPUT PARAMETERS  --  NONE
  1908. '
  1909. '  SUBROUTINE PURPOSE --  TO DISPLAY RBBS-PC's SYSOP MENU ON THE LOCAL SCREEN
  1910. '
  1911. 61840 SUB TRIMTRAIL (TRIM.PARM$,TRIM.THIS$) STATIC
  1912.       WHILE RIGHT$(TRIM.PARM$,1) = TRIM.THIS$
  1913.          TRIM.PARM$ = LEFT$(TRIM.PARM$,LEN(TRIM.PARM$) - 1)
  1914.       WEND
  1915.       END SUB
  1916. ' $SUBTITLE: 'FINDLAST - subroutine to find last occurence of a string'
  1917. ' $PAGE
  1918. '
  1919. '  SUBROUTINE NAME    -- FINDLAST
  1920. '
  1921. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1922. '                        LOOK.IN$           STRING TO LOOK INTO
  1923. '                        LOOK.FOR$          STRING TO SEARCH FOR
  1924. '
  1925. '  OUTPUT PARAMETERS  -- WHERE.FOUND        POSITION IN LOOK.IN$ THAT
  1926. '                                            LOOK.FOR$ FOUND
  1927. '                        NUM.FINDS          HOW MANY OCCURENCES IN LOOK.IN$
  1928. '
  1929. '  SUBROUTINE PURPOSE -- FINDS THE LAST OCCURANCE OF "LOOK.FOR$" IN "LOOK.IN$"
  1930. '                        AND RETURNS COUNT OF NUMBER OF OCCURENCES.  IF NONE
  1931. '                        ARE FOUND, BOTH RETURNED PARAMETERS ARE ZERO.
  1932. '
  1933.       SUB FINDLAST (LOOK.IN$,LOOK.FOR$,WHERE.FOUND,NUM.FINDS) STATIC
  1934. 61850 WHERE.FOUND = INSTR(LOOK.IN$,LOOK.FOR$)
  1935.       NUM.FINDS = -(WHERE.FOUND > 0)
  1936.       NEXT.FOUND = INSTR(WHERE.FOUND + 1,LOOK.IN$,LOOK.FOR$)
  1937.       WHILE NEXT.FOUND > 0
  1938.          NUM.FINDS = NUM.FINDS + 1
  1939.          WHERE.FOUND = NEXT.FOUND
  1940.          NEXT.FOUND = INSTR(WHERE.FOUND + 1,LOOK.IN$,LOOK.FOR$)
  1941.       WEND
  1942.       END SUB
  1943. ' $SUBTITLE: 'SECURE - subroutine to assign security to commands'
  1944. ' $PAGE
  1945. '
  1946. '  SUBROUTINE NAME    -- SECURE
  1947. '
  1948. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1949. '                        SECTION$           NAME OF THE SECTION
  1950. '                        DEFAULTS$          DEFAULT COMMANDS FOR THE SECTION
  1951. '                        NUMBER.OF.COMMANDS NUMBER OF COMMANDS IN THE SECTION
  1952. '                        COMMANDS$()        CHARACTERS REPRESENTING THE ONE-
  1953. '                                              CHARACTER COMMANDS
  1954. '                        COMMANDS()         SECURITY LEVEL ASSOCIATED WITH
  1955. '                                           THE COMMAND
  1956. '                        SECTION.COMMANDS$  PROMPT STRING OF ALL COMMANDS IN
  1957. '                                             THE SECTION
  1958. '
  1959. '  OUTPUT PARAMETERS  -- COMMANDS$()        CHARACTERS REPRESENTING THE ONE-
  1960. '                                              CHARACTER COMMANDS
  1961. '                        COMMANDS()         SECURITY LEVEL ASSOCIATED WITH
  1962. '                                           THE COMMAND
  1963. '                        SECTION.COMMANDS$  PROMPT STRING OF ALL COMMANDS IN
  1964. '                                             THE SECTION
  1965. '
  1966. '  SUBROUTINE PURPOSE -- ALLOWS USERS TO MODIFY COMMANDS AND SECURITY FOR
  1967. '                        EACH COMMAND.
  1968. '
  1969.       SUB SECURE (SECTION$,DEFAULTS$,NUMBER.OF.COMMANDS,COMMANDS$(2),COMMANDS(1),SECTION.COMMANDS$) STATIC
  1970. 61860 IF IPAGE = 2 OR _
  1971.          VAL(OPTION$) = 310 THEN _
  1972.          XX$ = "ALL " + _
  1973.                SECTION$ + _
  1974.                " commands use default letters?" _
  1975.       ELSE XX$ = "ALL " + _
  1976.                SECTION$ + _
  1977.                " commands = SAME security level?"
  1978.       LOCATE 24,1
  1979.       PRINT SPACE$(79);
  1980.       LOCATE 24,1
  1981.       CALL GETNUMYN (XX$,AB)
  1982.       IF NOT AB THEN _
  1983.          GOTO 61880
  1984. 61870 IF IPAGE = 2 OR _
  1985.          VAL(OPTION$) = 310 THEN _
  1986.          SECTION.COMMANDS$ = DEFAULTS$ : _
  1987.          FOR I = 1 TO NUMBER.OF.COMMANDS : _
  1988.             COMMANDS$(I,2) = MID$(SECTION.COMMANDS$,I,1) : _
  1989.          NEXT : _
  1990.          EXIT SUB
  1991.       CALL MMINTEGER("Security level for all " + _
  1992.                       SECTION$ + _
  1993.                      " commands is?",-32767,32767,B1)
  1994.       FOR I = 1 TO NUMBER.OF.COMMANDS
  1995.          COMMANDS(I) = B1
  1996.       NEXT
  1997.       GB = B1
  1998.       EXIT SUB
  1999. 61880 GOSUB 61900
  2000.       IROW = 4
  2001.       ICOL = 10
  2002.       FOR I = 1 TO NUMBER.OF.COMMANDS
  2003.          LOCATE IROW + I,ICOL
  2004.          IF IPAGE = 2 OR _
  2005.             VAL(OPTION$) = 310 THEN _
  2006.             PRINT COMMANDS$(I,1);" ";COMMANDS$(I,2) _
  2007.          ELSE PRINT COMMANDS$(I,1);STR$(COMMANDS(I))
  2008.       NEXT
  2009. 61890 CALL ASKRO("Enter first character of command ([ENTER] quits)",24,X$)
  2010.       IF X$ = "" THEN _
  2011.          EXIT SUB
  2012.       IF LEN(X$) <> 1 THEN _
  2013.          GOTO 61890
  2014.       CALL ALLCAPS(X$)
  2015.       FF = INSTR(DEFAULTS$,X$)
  2016.       IF FF = 0 THEN _
  2017.          GOTO 61890
  2018.       IF IPAGE = 2 OR _
  2019.          VAL(OPTION$) = 310 THEN _
  2020.          GOTO 61892
  2021.       CALL MMINTEGER("Security level for all " + _
  2022.                       SECTION$ + _
  2023.                      " '" + _
  2024.                      X$ + _
  2025.                      "' commands is?",-32767,32767,B1)
  2026.       GOTO 61893
  2027. 61892 CALL ASKRO("New command for " + _
  2028.                   MID$(COMMANDS$(FF,1),1,INSTR(COMMANDS$(FF,1),"  ")) + _
  2029.                  "is?",24,HK$)
  2030.       X$ = MID$(HK$,1,1)
  2031.       CALL ALLCAPS (X$) 
  2032.       IF LEN(HK$) > 1 THEN _
  2033.          HK$ = X$ + MID$(HK$,2)
  2034.       IF LEN (HK$) = 1 THEN _
  2035.          HK$ = X$
  2036.       COMMANDS$(FF,2) = HK$
  2037.       MID$(SECTION.COMMANDS$,FF,1) = HK$
  2038.       GOTO 61880
  2039. 61893 COMMANDS(FF) = B1
  2040.       GOTO 61880
  2041. '
  2042. ' * COMMON ROUTINE TO DISPLAY SUBSYSTEM COMMANDS AND THEIR SECURITY LEVELS
  2043. '
  2044. 61900 CLS
  2045.       I! = FRE(C$)
  2046.       COLOR 0,7,0
  2047.       LOCATE 1,23
  2048.       PRINT "RBBS-PC "+ CONFIG.VERSION$ + " Default Configuration";
  2049.       COLOR FG,BG,BORDER
  2050.       LOCATE  2,5
  2051.       PRINT "The RBBS-PC " + _
  2052.              SECTION$ + _
  2053.             " Commands are as follows:"
  2054.       LOCATE   3,10
  2055.       XX$ = "Command             Security"
  2056.       IF IPAGE = 2 OR _
  2057.          VAL(OPTION$) = 310 THEN _
  2058.          XX$ = "Description         Command"
  2059.       PRINT XX$
  2060.       RETURN
  2061.       END SUB
  2062. '  $SUBTITLE: 'GETCOLOR - get colors using natural language'
  2063. '  $PAGE
  2064. '
  2065. '  SUBROUTINE NAME    -- GETCOLOR
  2066. '
  2067. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  2068. '                        STRNG$             TITLE OF WHAT COLOR IS FOR
  2069. '                        NUM.COLOR          CURRENT COLOR SETTING
  2070. '
  2071. '  OUTPUT PARAMETERS  -- NUM.COLOR          NEW COLOR SETTING
  2072. '
  2073. '  SUBROUTINE PURPOSE -- SET THE COLOR USING NATURAL LANGUAGE PHRASES
  2074. '
  2075.       SUB GETCOLOR (STRNG$,NUM.COLOR) STATIC
  2076.       CLS
  2077. 61950 IF NUM.COLOR > 7 THEN _
  2078.          X = NUM.COLOR - 8 _
  2079.       ELSE X = NUM.COLOR
  2080.       X$ = MID$("<none>Blue  Green Cyan  Red   PurpleYellowWhite",X*6+1,6)
  2081.       LOCATE 9,15
  2082.       PRINT STRNG$;" now ";X$;"     ";
  2083. 61955 CALL ASKRO ("Make N)one,R)ed,G)reen,Y)ellow,B)lue,P)urple,C)yan,W)hite,[ENTER] quits",20,ANS$)
  2084.       IF ANS$ = "" THEN _
  2085.          EXIT SUB
  2086.       CALL ALLCAPS (ANS$)
  2087.       Y = INSTR("NBGCRPYW",ANS$) - 1
  2088.       IF Y < 0 THEN _
  2089.          GOTO 61955
  2090.       NUM.COLOR = Y
  2091.       GOTO 61950
  2092.       END SUB
  2093. ' $SUBTITLE: 'GETANSI - SUBROUTINE TO GET CALLERS COLOR VALUES'
  2094. ' $PAGE
  2095. '
  2096. '  SUBROUTINE NAME    -- GETANSI
  2097. '
  2098. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2099. '                        SELECTION$       NAME OF SELECTION TO HAVE COLOR
  2100. '                        PRMPT$           WHAT TO PROMPT ON THE SCREEN
  2101. '
  2102. '  OUTPUT PARAMETERS  -- FG.1.DEF$        FIRST COLOR SELECTION
  2103. '                        FG.2.DEF$        SECOND COLOR SELECTION
  2104. '                        FG.3.DEF$        THIRD COLOR SELECTION
  2105. '                        FG.4.DEF$        FOURTH COLOR SELECTION
  2106. '
  2107. '  SUBROUTINE PURPOSE -- ASK THE SYSOP TO SELECT THE FOUR COLORS TO BE
  2108. '                        USED FOR CALLERS THAT SELECT COLOR DISPLAYS.
  2109. '
  2110.       SUB GETANSI (SELECTION$,PRMPT$) STATIC
  2111.       CLS
  2112. 62000 LOCATE 8,10
  2113.       PRINT PRMPT$;" Foreground for caller now ";SELECTION$;"       "
  2114.       LOCATE 10,1
  2115.       PRINT "Current foreground selections: ";
  2116.       CALL COLORCODE (FG.1.DEF$,X$,X)
  2117.       COLOR X,CALLER.BKGRD
  2118.       PRINT "First ";
  2119.       CALL COLORCODE (FG.2.DEF$,X$,X)
  2120.       COLOR X
  2121.       PRINT "Second ";
  2122.       CALL COLORCODE (FG.3.DEF$,X$,X)
  2123.       COLOR X
  2124.       PRINT "Third ";
  2125.       CALL COLORCODE (FG.4.DEF$,X$,X)
  2126.       COLOR X
  2127.       PRINT "Fourth"
  2128.       COLOR FG,BG
  2129. 62040 CALL ASKRO ("Make N)one,R)ed,G)reen,Y)ellow,B)lue,P)urple,C)yan,W)hite,[ENTER] quits",14,ANS$)
  2130.       IF ANS$ = "" THEN _
  2131.          EXIT SUB
  2132.       CALL ALLCAPS (ANS$)
  2133.       X = INSTR("NRGYBPCW",ANS$)
  2134.       IF X < 2 THEN _
  2135.          SELECTION$ = NONE.PICKED$ : _
  2136.          GOTO 62000
  2137.       X$ = MID$("Red   Green YellowBlue  PurpleCyan  White",X*6-11,6)
  2138.       CALL ASKRO ("Make "+X$+" [B]right, or N)ormal",17,ANS$)
  2139.       CALL ALLCAPS (ANS$)
  2140.       IF ANS$ <> "N" THEN _
  2141.          SELECTION$ = "Bright " + X$ _
  2142.       ELSE SELECTION$ = "Normal " + X$
  2143.       GOTO 62000
  2144.       END SUB
  2145. ' $SUBTITLE: 'COLORCODE - SUBROUTINE TO GET COLOR CODES'
  2146. ' $PAGE
  2147. '
  2148. '  SUBROUTINE NAME    -- COLORCODE
  2149. '
  2150. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2151. '                        NAT.LANG.COLOR$  NATURAL LANGUAGE LETTER OF COLOR
  2152. '                                           N = NONE
  2153. '                                           B = BLUE
  2154. '                                           G = GREEN
  2155. '                                           C = CYAN
  2156. '                                           R = RED
  2157. '                                           P = PURPLE
  2158. '                                           Y = YELLOW
  2159. '                                           W = WHITE
  2160. '
  2161. '  OUTPUT PARAMETERS  -- ANSI.COLOR$      CORRECT CHARACTER SEQUENCE OF COLOR
  2162. '                        BASIC.FG         NUMBER FOR BASIC FORGROUND
  2163. '
  2164. '  SUBROUTINE PURPOSE -- TO CONVERT THE NATURAL LANGUAGE COLOR SELECTION INTO
  2165. '                        COLOR CODES THAT ARE MEANINGFUL.
  2166. '
  2167.       SUB COLORCODE (NAT.LANG.COLOR$,ANSI.COLOR$,BASIC.FG) STATIC
  2168.       BASIC.FG = 7
  2169.       IF NAT.LANG.COLOR$ = NONE.PICKED$ THEN _
  2170.          ANSI.COLOR$ = "" : _
  2171.          EXIT SUB
  2172.       X = INSTR(" BN",LEFT$(NAT.LANG.COLOR$,1))
  2173.       IF X < 2 THEN _
  2174.          EXIT SUB
  2175.       X$ = MID$("10",X-1,1)
  2176.       X = INSTR(NAT.LANG.COLOR$," ")
  2177.       IF X < 1 OR X >= LEN(NAT.LANG.COLOR$) THEN _
  2178.          EXIT SUB
  2179.       Z$ = MID$(NAT.LANG.COLOR$,X+1,1)
  2180.       X = INSTR("RGYBPCW",Z$)
  2181.       IF X < 1 THEN _
  2182.          EXIT SUB
  2183.       BASIC.FG = INSTR("BGCRPYW",Z$) - 8 * (X$="1")
  2184.       Y$ = MID$(STR$(30+X),2)
  2185.       Z = INSTR("NRGYBPCW",MID$("NBGCRPYW",CALLER.BKGRD+1,1))
  2186.       Z$ = MID$(STR$(39+Z),2)
  2187.       ANSI.COLOR$ = CHR$(27) + "[" + X$ + ";" + Z$ + ";" + Y$ + "m"
  2188.       END SUB
  2189. ' $SUBTITLE: 'ANSIDECODE - SUBROUTINE TO DECODE ANSI VALUES'
  2190. ' $PAGE
  2191. '
  2192. '  SUBROUTINE NAME    -- ANSIDECODE
  2193. '
  2194. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2195. '                        ANSI.EXPRESSION$ EXPRESSION WITH ANSI COLOR CODES IN
  2196. '
  2197. '  OUTPUT PARAMETERS  -- ANSI.EXPRESSION$ ENGLISH LANGUAGE DESCRIPTION OF COLOR
  2198. '
  2199. '  SUBROUTINE PURPOSE -- DECODES THE ANSI EXPRESSION INTO A MEANINGFUL
  2200. '                        ENGLISH TEXT DESCRIPTION.
  2201. '
  2202.       SUB ANSIDECODE (ANSI.EXPRESSION$) STATIC
  2203.       IF LEN (ANSI.EXPRESSION$) < 3 THEN _
  2204.          EXIT SUB
  2205.       IF ASC(ANSI.EXPRESSION$) <> 27 THEN _
  2206.          EXIT SUB
  2207.       X = INSTR(ANSI.EXPRESSION$,";")
  2208.       IF X < 1 THEN _
  2209.          EXIT SUB
  2210.       IF MID$(ANSI.EXPRESSION$,X-1,1) = "1" THEN _
  2211.          X$ = "Bright " _
  2212.       ELSE X$ = "Normal "
  2213.       X = INSTR(X,ANSI.EXPRESSION$,"m")
  2214.       IF X < 1 THEN _
  2215.          EXIT SUB
  2216.       X = VAL(MID$(ANSI.EXPRESSION$,X-2,2)) - 30
  2217.       IF X < 1 OR X > 7 THEN _
  2218.          EXIT SUB
  2219.       ANSI.EXPRESSION$ = X$ + MID$("Red   Green YellowBlue  PurpleCyan  White",X*6-5,6)
  2220.       END SUB
  2221. 62100 ' set modem strings by selecting a modem                       ' KG103101
  2222.       SUB SELMODEM STATIC                                            ' KG103101
  2223.       CALL FINDFILE ("MODEMS.SET",OK)                                ' KG103101
  2224.       IF NOT OK THEN _                                               ' KG103101
  2225.          EXIT SUB                                                    ' KG103101
  2226. 62105 CLS                                                            ' KG103101
  2227.       LOCATE 5,15                                                    ' KG103101
  2228.       PRINT "Select the MODEM MODEL YOU ARE USING";                  ' KG103101
  2229.       LOCATE 7,10                                                    ' KG103101
  2230.       PRINT "Use Parameter 231 to initialize modem's firmware"       ' KG103101
  2231.       IF NETWORK.TYPE = 6 THEN _                                     ' KG103101
  2232.          OPEN "MODEMS.SET" FOR INPUT SHARED AS #2 _                  ' KG103101
  2233.       ELSE OPEN "I",2,"MODEMS.SET"                                   ' KG103101
  2234.       ANS$ = ""                                                      ' KG103101
  2235.       WHILE NOT EOF(2) AND ANS$ <> "S"                               ' KG103101
  2236.          INPUT #2, MODEM.MODEL$, SWITCHES$                           ' KG103101
  2237.          FOR I = 1 TO 12                                             ' KG103101
  2238.             INPUT #2,A$(I)                                           ' KG103101
  2239.          NEXT                                                        ' KG103101
  2240.          LOCATE 10,10                                                ' KG103101
  2241.          PRINT SPACE$(60);                                           ' KG103101
  2242.          LOCATE 10,14                                                ' KG103101
  2243.          PRINT "Model Modem: ";MODEM.MODEL$;                         ' KG103101
  2244.          LOCATE 12,10                                                ' KG103101
  2245.          PRINT SPACE$(60);                                           ' KG103101
  2246.          LOCATE 12,10                                                ' KG103101
  2247.          PRINT "Switch Settings: ";SWITCHES$                         ' KG103101
  2248.          CALL ASKRO("S)elect this model (Enter for next choice)?",24,ANS$) ' KG103101
  2249.          CALL ALLCAPS (ANS$)                                         ' KG103101
  2250.       WEND                                                           ' KG103101
  2251.       CLOSE 2                                                        ' KG103101
  2252.       IF ANS$ = "S" THEN _                                           ' KG103101
  2253.          EXIT SUB                                                    ' KG103101
  2254.       GOTO 62105                                                     ' KG103101
  2255.       END SUB                                                        ' KG103101
  2256.